Importação de dados
Pessoal, estou importando dados de um sistema PARADOX para SQL Server.
O banco no SQL Server está todo relacionado direitinho, o problema é que o Paradox não. Um dos problemas é que há campos no SQL Server que são obrigatórios (NOT NULL) e que eventualmente não foram preenchidos no Paradoex. Para evitar testar campo por campo se ele é nulo tentei fazer uma função mas não está dando certo... eis o código:
A estou usando assim:
Mas executar e receber um campo nulo ele não consegue determinar o tipo da variável e sai sem retornar nada.
Alguma idéia de como corrigir isso ou uma idéia melhor pra gerenciar o problema da importação?
O banco no SQL Server está todo relacionado direitinho, o problema é que o Paradox não. Um dos problemas é que há campos no SQL Server que são obrigatórios (NOT NULL) e que eventualmente não foram preenchidos no Paradoex. Para evitar testar campo por campo se ele é nulo tentei fazer uma função mas não está dando certo... eis o código:
procedure TfrmPrincipal.Transfere(Origem: TField); begin if origem.IsNull then begin case VarType(origem.Value) of varInteger : Result := 0; varDate : Result := Date; varString : Result := ´*´; end; end else begin Result := origem.Value; end; end;
A estou usando assim:
querySQLBairro.Value := Transfere(queryPARADOXPBAIRR1);
Mas executar e receber um campo nulo ele não consegue determinar o tipo da variável e sai sem retornar nada.
Alguma idéia de como corrigir isso ou uma idéia melhor pra gerenciar o problema da importação?
Willian
Curtidas 0
Respostas
Emerson Nascimento
06/08/2009
tente com esse código (note que precisa ser uma function, não uma procedure):
obs.: para esse código funcionar é preciso acrescentar a unit TypInfo à sua cláusula uses.
function TfrmPrincipal.Transfere(Origem: TField): variant; begin if Origem.IsNull then case Origem.DataType of ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftFMTBcd, ftLargeint: Result := 0; ftDate, ftDateTime, ftTimeStamp : Result := Date; ftTime : Result := Time; ftString, ftFixedChar, ftWideString : Result := ´*´; else ShowMessage(´O campo "´+Origem.FieldName+´" é do tipo ´+ GetEnumName(TypeInfo(TFieldType), integer(Origem.DataType)) + ´ e não foi tratado no case.´#13´Corrija.´ ); Result := null; end else Result := origem.Value; end;
obs.: para esse código funcionar é preciso acrescentar a unit TypInfo à sua cláusula uses.
GOSTEI 0
Mkoch
06/08/2009
Em vez de usar o ´VarType(origem.Value)´ tenta fazer esse teste com o tipo do campo para retornar um valor.
Se o tipo do campo é String
retorna ´´
Se o tipo do campo é Data
retorna Data
...
Resumindo:Tentar ver o tipo do campo pela sua definição e não pelo seu conteúdo.
Se o tipo do campo é String
retorna ´´
Se o tipo do campo é Data
retorna Data
...
Resumindo:Tentar ver o tipo do campo pela sua definição e não pelo seu conteúdo.
GOSTEI 0
Willian
06/08/2009
Obrigado a todos pelas sugestões.
emerson.en,
Seu código funcionou perfeitamente... muito obrigado!!! Resolveu meu problema.
emerson.en,
Seu código funcionou perfeitamente... muito obrigado!!! Resolveu meu problema.
GOSTEI 0