Problema com leitura campo no SQL

Discussão em 'Progress 4GL' iniciado por patriciaoliveira, Fevereiro 19, 2010.

  1. patriciaoliveira

    patriciaoliveira Sem Pontuação

    Galera,

    Eu trabalho com SQL Server. Tenho um Linked Server que aponta para um banco PROGRESS. Os meus selects funcionam perfeitamente com o Openquery ou referenciando diretamente o Linked Server. Porém um erro ocorrido em uma query específica me fez investigar mais a fundo o que acontecia na tabela. Segue query e erro abaixo:

    Query:
    Select *
    From Openquery(LinkedServer, 'Select campo1
    From PUB.Table_Name')

    Erro:
    An unexpected NULL value was returned for column "[MSDASQL].campo1" from OLE DB provider "MSDASQL" for linked server "LinkedServer". This column cannot be NULL.

    Bem, fiz vários levantamentos e pudemos identificar que o Progress não faz controle dos campos de suas tabelas. Se eu tenho um campo com 200 caracteres, posso digitar 300 que o progress permite. Mas nesse caso o SQL dá erro e quando faço um CAST no campo retorna o dado nulo.

    Alguém tem alguma dica de como ler este campo pelo SQL. O analista de progress aqui da empresa só consegue ler esse campo usando o foreach.

    Desde já agradeço,
    Patrícia :roll:
  2. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    Olá,

    Na verdade quando você cria um campo no progress ele sempre vai permitir você gravar valores maiores, o que é definido é o tamanho do display. Mas existe uma opção do campo Progress chamada FIELD WIDTH que é o tamanho do campo que será retornado através de um SQL, e realmente se a informação gravada for maior que este campo será apresentado o erro abaixo.

    Você pode corrigir este tamanho do seu campo que não gera erro de CRC, mas deve entrar em monousuário no DataDictionary do Banco Progress, selecionar a tabela que contém o campo, ir no menu Options, opção Adjust Field Width, serão exibidos os campos passiveis de alteração, o padrão Progress para o Width é o dobro do "Format", ou no mínimo seu tamanho.

    Já tive este problema, e foi a minha solução aumentar este tamanho de Width.

    []'s
  3. patriciaoliveira

    patriciaoliveira Sem Pontuação

    Valeu!

    Vou passar para a área responsável pelo progress aqui na empresa. Te aviso quando funcionar.

    Muito obrigada!
  4. patriciaoliveira

    patriciaoliveira Sem Pontuação

    Cleilton,

    A solução dada por vc funcionou direitinho.

    Muito Obrigada,

    Patrícia
  5. patriciaoliveira

    patriciaoliveira Sem Pontuação

    Pessoal,

    Agora estou com problema para ler um campo char do progress. Não sei se se encaixa no problema acima pois agora o campo é um Char e não mais um decimal e o erro que aparece é diferente.

    Column "nome da coluna" in table "PUB.tabela" has value exceeding its max length or precision.

    Alguém sabe me dizer se a solução para este erro é o mesmo do problema acima? Detalhe, mesmo com o cast o select da coluna continua apresentando o erro. Segue select abaixo:

    Select *
    From OpenQuery( LinkedServer, 'Select Cast(coluna1 As Varchar(255))
    From Pub.tabela')

    Muito obrigada
  6. kirchner

    kirchner Membro Participativo Moderador

    Patrícia,

    O problema é o mesmo. O progress não controla tamanho das colunas quando você insere dados via ABL. Isso quer dizer que a coluna definida com 10 pode receber 32k de dados.

    A dor de cabeça começa quando você acessa o banco via ODBC/JDBC. Neste caso o Progress impõe limite de tamanho de colunas, porque a especificação SQL diz que é assim.

    A melhor opção, eu penso, é a ferramenta dbtool. Ela vai ler o banco inteiro e ajustar a definição de todos os campos cujo dados são maiores que o definido. Não há alteração de dados, só definições. E você pode executar sem parar o banco.

Compartilhe esta Página