Fórum sintegra #2537
04/02/2009
0
var
TempStr: string;
begin
Result := True; //Executa a seleção dos registros no banco de dados
with deasy.QrySintegra do
begin
Close; unprepare; sql.Clear;
SQL.Add('SELECT distinct barras, cst, descricao, un,');
SQL.Add('aliquota, basedecalculo, basest, dataemissao');
SQL.Add('FROM itensnota WHERE');
SQL.Add('notaid IN (');
SQL.Add('SELECT notaid FROM nota WHERE');
SQL.Add('(dataemissao BETWEEN :datahora_ini AND :datahora_fim) AND (');
SQL.Add('(modelo = ''01'') OR');
SQL.Add('(modelo = ''1A'') OR');
SQL.Add('(modelo = ''03'') OR');
SQL.Add('(modelo = ''06'') OR');
SQL.Add('(modelo = ''22'')))'); ParamByName('datahora_ini').asdatetime := DataHora_Inicial;
ParamByName('datahora_fim').asdatetime := DataHora_Final; prepare; Open; if RecordCount > 0 then
begin
while not deasy.QrySintegra.EOF do
begin
//Faz a chamada da dll passando as informações do banco de dados e armazena numa string temporária
TempStr := Registro75(datetostr(DataHora_Inicial), //Data Inicial
fields.FieldByName('dataemissao').asstring, //datetostr(DataHora_Final), //Data_Final
Fields.FieldByName('barras').AsString, //Cod_Produto_Servico
Fields.FieldByName('cst').AsString, //Cod_NCM
Fields.FieldByName('descricao').AsString, //Descricao
Fields.FieldByName('un').AsString, //UND_Medida
'0', //Aliquota_IPI
formatcurr('0.00', Fields.FieldByName('aliquota').AsFloat), //Aliquota_ICMS
formatcurr('0.00', Fields.FieldByName('basedecalculo').AsFloat), //Aliquota_ICMS
Fields.FieldByName('basest').AsString
); //Base_ICMS_Subst
//Executa o tratamento da string temporária testando se houve erro
//Caso haja erro, executa o log das informações inconsistentes no RichEdit
if not Trata_SIntegra_Str(TempStr) then
begin
qnt_erro := qnt_erro + 1;
Result := False; Err_Msg := Err_Msg + #13 +
' Data Inicial: ' + datetostr(DataHora_Inicial) + #13 +
' Data Final: ' + fields.FieldByName('dataemissao').asstring + #13 +//datetostr(DataHora_Final) + #13 +
' Codigo Produto: ' + Fields.FieldByName('barras').AsString + #13 + ' Descricao: ' + Fields.FieldByName('descricao').AsString + #13 +
' Unidade: ' + Fields.FieldByName('un').AsString + #13 +
' CST: ' + Fields.FieldByName('cst').AsString + #13 + ' Aliquota ICMS: ' + floattostr(Fields.FieldByName('aliquota').AsFloat * 100) + #13 +
' Base ICMS Subst: ' + Fields.FieldByName('basest').AsString;
end
else
qnt_ok := qnt_ok + 1; if not EOF then
Next; if quit_sintegra then
exit;
end;
end;
end;
end; ele faz direitim so que se tiver dois registro 75 na mesma data de emissao ele gera dois 75 quero fazer de uma maneira que ele nao duplique esses registros ja tentei um monte de coisa so que so meio novo no rad e to um tempao mechendo com esse projeto!
Paulo Silva
Curtir tópico
+ 0Posts
04/02/2009
Wesley Yamazack
Observe o seu select, o Distinct irá retornar duas linhas somente quando um dos registros estiver diferente exemplo
Nome Telefone SEXO
ABC 123 F
DBC 123 F
ABC 123 M
o 1º e o 2º registro são semelhantes mas devido ao sexo ser diferentes, com o distinct ele irá possuir um outro registro. Então tente ver as colunas que são semelhantes e as que você realmente não vai precisar usar. Evitando assim este tipo de erro.
Att,
Wesley Y
Gostei + 0
04/02/2009
Paulo Silva
Gostei + 0
04/02/2009
Paulo Silva
Gostei + 0
04/02/2009
Wesley Yamazack
Eu estava pensando em fazer algo do tipo
SELECT CST, DESCRICAO, DESCRICAO FROM ITENSNOTA I
WHERE I.IDNOTA IN (
( SELECT IDNOTA FROM NOTA
WHERE DATAEMISSAO BETWEEN '2008-01-01' AND '2008-03-01')
)
O problema do distinct é que se você tiver 2 registros identicos com um campo apenas diferente, ele vai duplicar, tente, no teu select, tente retirar todos os campos deixando somente o IDNota, e veja no que vai dar, se tiver como me mandar o banco.
Att,
Wesley Y
Gostei + 0
06/02/2009
Paulo Silva
7520060701200607277898119110030 070 ACUCAR SABOR CRISTAL 5KG 6X5 FD 000001200121670000000000000 ou seja e o mesmo produto na mesma emissao so que o 6x5 ae diferenciou ele sabe tipo eu fiz dois cadastros com a mesma emissao do mesmo produto um entrou no meu estoque hj de manha depois outro caminhao veio e me trouxe novamente o mesmo produto so que o kra que foi digitar colocou o 6x5 que mudou a parada ao inves de ele me retornar que esse produto entrou hj ele ta diferenciando os dois o que eu quero fazer e pegar e colocar pelo codigo de barra ae tipo q entrou so o açucar com o codigo 7898119110030 tipo hj entrou açucar com esse codigo na data x por fardo so isso eu precisaria que meu select pegasse so um com o mesmo codigo e a mesma data de emissao ou seja que desse um distinct no codigo do produto pq o mesmo produto pode entrar 7 vezes no mesmo dia como vc esta vendo tem o mesmo codigo mais ele ta considerando outro produto!
Gostei + 0
06/02/2009
Wesley Yamazack
Estou analisando seu problema e tenho uma dúvida, se o código de barras é o mesmo consequentemente o produto será o mesmo, sendo assim seu sistema não esta tendo consistencia, onde você tem o mesmo produto com os mesmos dados cadastrados, assim fica inviável de resolver seu problema, pois como te falei o distinct só irá funcionar para registros iguais. Exemplo
===================
CodBarra Descricao QNT |
0000001 ABC 5 |
0000001 ABC 5 |
0000001 ABCDEF 5 |
===================
Com o exemplo a cima usando o Distinct ele retornaria apenas 2 registros, como abaixo é mostrado.
===================
CodBarra Descricao QNT |
0000001 ABC 5 |
0000001 ABCDEF 5 |
===================
Sugiro que na hora em que você ou algum outro usuário for informar os produtos que chegaram, em um determinado caminhão, o usuário não possa digitar a descrição, apenas fazer uma consulta pelo Cód de Barras ou pela propria descrição, mas nunca cadastrar um novo produto, pois se mudar um "a", ou um ".", o seu distinct não irá funcionar.
Mais a baixo você disse que queria pegar o produto com o mesmo Cod.Barras e a mesma Data sendo assim coloque no seu "Where" um parametro para informar qual é a data desejada, sendo assim ficaria mais facil derrepente nem precisaria do distinct.
Exemplo : Sem o Distinct
SELECT DESCRICAO, QNT, CODBARRA
FROM PRODUTO
WHERE DATA = :P_DATA
AND CODBARRA = :P_CODBARRA
Exemplo : Com o Distinct
SELECT DISCINCT DESCRICAO, QNT, CODBARRA
FROM PRODUTO
WHERE DATA = :P_DATA
Espero que isso resolva o seu problema, meu caro. Estamos a disposição.
Att,
Wesley Y
Gostei + 0
06/02/2009
Paulo Silva
Gostei + 0
06/02/2009
Wesley Yamazack
1 - Você esta resolvendo seu problema hoje, porém amanha teras outros tipos de problema, só queria te dar uma dica, se possivel para com a forma que esta fazendo e comece a desenvolver um sistema, pois seus dados daqui a pouco vão começar a se tornarem inconsistentes dai seu problema, poderá e será bem maior.
2 - No post Postado em: 2/4/2009 6:28:02 PM, eu te mostrei como fazer isso que seu amigo esta dizendo, você da um select internet so com os codigos e por fora você faz um outro select. Exemplo.
SELECT CST, DESCRICAO, DESCRICAO FROM ITENSNOTA I
WHERE I.IDNOTA IN (
( SELECT IDNOTA FROM NOTA
WHERE DATAEMISSAO BETWEEN '2008-01-01' AND '2008-03-01')
)
Isso ae resolverá teu problema no momento, mas futuramente não terá outra solução a não ser desenvolver o sistema. Espero que tenha ajudado
Att,
Wesley
Gostei + 0
06/02/2009
Paulo Silva
SQL.Add('aliquota, basedecalculo, basest, dataemissao');
SQL.Add('FROM itensnota WHERE');
SQL.Add('notaid IN (');
SQL.Add('SELECT notaid FROM nota WHERE');
SQL.Add('(dataemissao BETWEEN :datahora_ini AND :datahora_fim) AND (');
SQL.Add('(modelo = ''01'') OR');
SQL.Add('(modelo = ''1A'') OR');
SQL.Add('(modelo = ''03'') OR');
SQL.Add('(modelo = ''06'') OR');
SQL.Add('(modelo = ''22'')))'); ParamByName('datahora_ini').asdatetime := DataHora_Inicial;
ParamByName('datahora_fim').asdatetime := DataHora_Final; tipo so que ele desse um distinct so no codigo pois assim nao iria aparecer dois produtos ja que eles teem o mesmo codigo e a mesma data de emissao, tipo ali ele pega esses campos e passa pra um txt com os dados eu preciso que ele fassa isso mais sem repetir produtos com o mesmo codigo se o select desse distinct no codigo por exemplo entao nao teria dois produtos com o mesmo codigo, mais realmente eu n sei como faz isso essa e a parte complicada da coisa sao apenas medidas provisorias ate mesmo pq meu projeto ainda e so teste e tem muito o que melhorar ainda!!! pega meu banco de dados eu upei no meu ftp ftp.brturbo.com.br usuario: destruidor28 senha:123mudar (esqueci minha senha eles alteraram pra mim mais eu nunca mudei aehuuhehueauuhe O.o)
ta na pasta nomeada de banco firebird 2.1
Gostei + 0
06/02/2009
Wesley Yamazack
Me diz uma coisa, neste arquivo Txt, existem produtos Iguais? São somente daquela data que você esta falando, exemplo 4 mil produtodos da data de hoje.?
Pois como te expliquei os dados tem que estar iguais para que o distinct funciona. Não estou conseguindo ter acesso ao seu FTP. Manda ae o link que você abre inicialmente.
Fico no aguardo.
Att,
Wesley Y
Gostei + 0
06/02/2009
Paulo Silva
Gostei + 0
06/02/2009
Wesley Yamazack
É o seguinte, você disse que os produtos não se repetem no mes, então quando você usar a clausula
Where DATA BETWEEN :DTINI AND :DTFIM, ele so vai pegar os produtos daquele mes, não tem como ele pegar os produtos de outro mes não, e então você não precisa usar o distinct, pois todos os produtos que estão ali são diferentes. Sacou ?
Se possivel me manda o teu programa, pra eu dar uma olhada.
Qual FireBird você esta usando. 2.1 correto ?. Tentei me conectar configurando FB 1.5, 2.0. 2.1 e todos deram o mesmo erro..
Wrong or obsolete version
Fico no aguardo de mais informações
Gostei + 0
08/02/2009
Paulo Silva
Gostei + 0
08/02/2009
Wesley Yamazack
Me mande o Select do seu amigo, para que adptar, e te explicar como funciona. Fico no aguardo.
Att,
Wesley Y
Gostei + 0
10/02/2009
Paulo Silva
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)