GARANTIR DESCONTO

Fórum Formato de moeda #289727

27/07/2005

0

Galera utilizo o código abaixo para importar um arquivo txt.

var
I : Integer;
Arquivo : TStringList;
begin
Arquivo := TStringList.Create;
try
Arquivo.LoadFromFile(´C:\Farma Smart\ABCFarmaTemp\Tabela.txt´);

for i := 0 to (Arquivo.Count - 1) do
begin
DM2.CDSCadProdutos.FieldByName(´CODIGO_MEDICAMENTO´).AsString := copy(Arquivo.Strings[I],01,09);
DM2.CDSCadProdutos.FieldByName(´CODIGO_CONTROLE´).AsString := copy(Arquivo.Strings[I],10,10);
DM2.CDSCadProdutos.FieldByName(´CODIGO_LABORATORIO´).AsString := copy(Arquivo.Strings[I],11,16);
DM2.CDSCadProdutos.FieldByName(´NOME_LABORATORIO´).AsString := copy(Arquivo.Strings[I],17,46);
DM2.CDSCadProdutos.FieldByName(´DESCRICAO_MEDICAMENTO´).AsString := copy(Arquivo.Strings[I],47,91);
DM2.CDSCadProdutos.FieldByName(´APRESENTACAO_MEDICAMENTO´).AsString := copy(Arquivo.Strings[I],92,136);
DM2.CDSCadProdutos.FieldByName(´PRECO_LABORATORIO´).AsString := copy(Arquivo.Strings[I],137,147);
DM2.CDSCadProdutos.FieldByName(´PRECO_MAXIMO_VENDA´).AsString := copy(Arquivo.Strings[I],148,158);
DM2.CDSCadProdutos.FieldByName(´PRECO_FRACAO´).AsString := copy(Arquivo.Strings[I],159,169);
DM2.CDSCadProdutos.FieldByName(´UNIDADE_VENDA´).AsString := copy(Arquivo.Strings[I],170,172);
DM2.CDSCadProdutos.FieldByName(´PORCENTAGEM_IPI´).AsString := copy(Arquivo.Strings[I],173,177);
DM2.CDSCadProdutos.FieldByName(´DATA_VIGENCIA´).AsString := copy(Arquivo.Strings[I],178,185);
DM2.CDSCadProdutos.FieldByName(´PRODUTO_NOVO_VELHO´).AsString := copy(Arquivo.Strings[I],186,186);
DM2.CDSCadProdutos.FieldByName(´CODIGO_BARRAS´).AsString := copy(Arquivo.Strings[I],187,199);
DM2.CDSCadProdutos.FieldByName(´MEDICAMENTO_GENERICO´).AsString := copy(Arquivo.Strings[I],200,202);
DM2.CDSCadProdutos.FieldByName(´MEDICAMENTO_NEGATIVO_POSITIVO´).AsString := copy(Arquivo.Strings[I],203,205);
DM2.CDSCadProdutos.FieldByName(´MEDICAMENTO_NEUTRO´).AsString := copy(Arquivo.Strings[I],206,208);
DM2.CDSCadProdutos.FieldByName(´PRINCIPIO_ATIVO´).AsString := copy(Arquivo.Strings[I],209,338);
Application.ProcessMessages;

if ModalResult = mrCancel then
Break;

end;
finally
FreeAndNil(Arquivo);
DM2.CDSCadProdutos.Post;
end;
end;

Como podem ver existem três campos referentes a valores. Como o arquivo utiliza zeros para completar as colunas que tem menos caracteres do que o necessário os campos do banco de dados (Firebird) tiveram que ser criados como VARCHAR. Na hora da importação eu estou conseguindo retirar os zeros a esquerda que complementam os campos de valores com o código abaixo.

A := DM2.CDSCadProdutosPRECO_LABORATORIO.AsInteger;
DM2.CDSCadProdutosPRECO_LABORATORIO.Value := IntToStr(A);

Agora preciso apresentar os valores em um dbgrid, mas não estou conseguindo. Aguém pode me dar uma ajuda

:D


Demetrius

Demetrius

Responder

Posts

27/07/2005

Rjun

Como é o layout dos valores? ´N´ casas com 2 decimais? Se for assim, você poderia ter criado no banco campos especificos para valores decimais. Na importação você pega a string, converte para inteiro e divide por 100.


Responder

Gostei + 0

27/07/2005

Demetrius

Os valores estão assim no TXT:

00000009801

e o formato do layout é esse:

Preco do Laboratorio 11 posicoes numericas sendo 2 decimais.


Responder

Gostei + 0

27/07/2005

Rjun

Então, em vez de você definir um campo varchar para guardar valor monetário, crie um campo float (não sei como é em Firebird, no SQL Server tem o tipo money).

Quando você faz a importação, faça assim :

DM2.CDSCadProdutos.FieldByName(´PRECO_FRACAO´).Value := strtoint(copy(Arquivo.Strings[I],159,169)) / 100; 



Responder

Gostei + 0

27/07/2005

Demetrius

Deu erro.

Project .......... raised exception class EconvertError with message ´´000000098010000001302800000000260050000000304200F7897595900579 NAONAOACIDOACETILSALICILICO ´ is not valid integer value´.

Pelo que eu entendi do erro é que ele não separou as colunas apartir do preço do laboratório.
Abaixo estou enviando o layout do txt.

1) Codigo do Medicamento 9 posicoes numericas (1-9)
2) Codigo de Controle 1 posicao alfanumerica (10)
M- Medicamento controlado (com preco maximo ao consumidor)
L- Medicamento liberado (sem preco maximo ao consumidor)
X- Medicamento com aumento de precos liberado para os laboraotirios
pelo governo (com preco maximo ao consumidor)
3) Codigo do Laboratorio 6 posicoes numericas (11-16)
4) Nome do Laboratorio 30 posicoes alfabeticas (17-46)
5) Descricao do Medicamento 45 posicoes alfabeticas (47-91)
6) Apresentacao do Medicamento 45 posicoes alfabeticas (92-136)
7) Preco do Laboratorio 11 posicoes numericas sendo 2 decimais (137-147)
8) Preco Maximo de Venda 11 posicoes numericas sendo 2 decimais (148-158)
9) Preco da Fracao de Venda 11 posicoes numericas sendo 2 decimais (159-169)
10) Unidade de Venda 3 posicoes numericas (170-172)
11) Porcentual do IPI 5 posicoes numericas sendo 2 decimais (173-177)
12) Data de Vigencia 8 posicoes numericas no formato dd/mm/aaaa (178-185)
13)Campo logico de 1 posicao que quando for T se refere a um produto novo, quando for F se refere a produto ja existente (186-186)
14)Codigo de Barras do produto 13 posicoes numericas (187-199)
15)Medicamento generico 3 posicoes alfabeticas que quando for
GEN o produto e generico e quando for vazio e nao generico (200-202)
16) Campo indicativo da lista positiva/negativa 3 posicoes alfabeticas
quando o campo for SIM e lista positiva, NAO e lista negativa (203-205)
17) Campo indicativo da lista neutra 3 posicoes alfabeticas
quando o campo for SIM e lista neutra, NAO desconsiderar (206-208)
18) Principio ativo do produto 130 posicoes alfabeticas (209-338)


Responder

Gostei + 0

27/07/2005

Rjun

A sintaxe da função copy é:

copy(S, Index, Count);


Então se você quer copiar os 10 caracteres de uma linha, começando pela posição 159 então seria:

copy(Linha, 159, 10);



Responder

Gostei + 0

27/07/2005

Demetrius

Obrigado, funcionou beleza!!!
:D :D :D


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar