Fórum Verificar se registro já existe #385060
29/08/2010
0
Estou tentando usar o ClientDataSet1.findKey mas não estou conseguindo, ele informa o
erro 'Unknown ISC error 0'.
Gostaria de saber como verifico se a venda já existe, e se existir, trazê-la.
...
With dm do
Begin
If TableVenda.findkey([TableVendaDocumento.value,TableVendaNumero.value]) then
Begin
M:=TableVendaDocumento.value;
R:=TableVendaNumero.Value;
TableVenda.cancel;
TableVenda.FindKey([M,R]);
venda(Db1,Db2,Db3,EditDocumento,EditNumero,Editdata,DbGridVenda);
Db1.SetFocus;
end
Else
Begin
venda(Db1,Db2,Db3,EditDocumento,EditNumero,Editdata,DbGridVenda);
TableVendaData.Value:=Date;
Db1.SetFocus;
end;
end;
Li na internet que preciso setar o indice, mas o indice é a própria chave 'Documento e Numero'.
Caso precisasse setar um indice no ClientDataSet como seria ?.
Grato.
Marcos Roberto
Curtir tópico
+ 0Posts
29/08/2010
Marco Salles
Estou tentando usar o ClientDataSet1.findKey mas não estou conseguindo, ele informa o
erro 'Unknown ISC error 0'.
Gostaria de saber como verifico se a venda já existe, e se existir, trazê-la.
...
With dm do
Begin
If TableVenda.findkey([TableVendaDocumento.value,TableVendaNumero.value]) then
Begin
M:=TableVendaDocumento.value;
R:=TableVendaNumero.Value;
TableVenda.cancel;
TableVenda.FindKey([M,R]);
venda(Db1,Db2,Db3,EditDocumento,EditNumero,Editdata,DbGridVenda);
Db1.SetFocus;
end
Else
Begin
venda(Db1,Db2,Db3,EditDocumento,EditNumero,Editdata,DbGridVenda);
TableVendaData.Value:=Date;
Db1.SetFocus;
end;
end;
Li na internet que preciso setar o indice, mas o indice é a própria chave 'Documento e Numero'.
Caso precisasse setar um indice no ClientDataSet como seria ?.
Grato.
Gostei + 0
29/08/2010
Pjrm1470
if TableVenda.Locate('VendaDocumento', ValorDeBusca, []) thenif TableVenda.Locate('VendaNumero', ValorDeBusca, []) thenGostei + 0
29/08/2010
Marcos Roberto
Fiz como vc falou, criei o indice e ainda não resolveu.
A tabela tem duas chaves que pode ser documento=NC e Numero='0001' ou Documento='NF' e Numero='0001'.
NC Nota ao Consumidor e NF Nota Fiscal para pessoa Juridica.
Este metodo funcionava qdo usava com paradox, agora no Firebird esta com este problema.
...
PJRM1470
Posso usar o Locate, mas como passo as duas chaves no locate ???? já tentei e dá erro no sintaxe.
....
grato pessoal
Gostei + 0
29/08/2010
Pjrm1470
Gostei + 0
29/08/2010
Marco Salles
Fiz como vc falou, criei o indice e ainda não resolveu.
A tabela tem duas chaves que pode ser documento=NC e Numero='0001' ou Documento='NF' e Numero='0001'.
NC Nota ao Consumidor e NF Nota Fiscal para pessoa Juridica.
Este metodo funcionava qdo usava com paradox, agora no Firebird esta com este problema.
...
PJRM1470
Posso usar o Locate, mas como passo as duas chaves no locate ???? já tentei e dá erro no sintaxe.
....
grato pessoal
Gostei + 0
30/08/2010
Eriley Barbosa
Begin
If TableVenda.Locate('Documento;Numero', VarArrayOf([TableVendaDocumento.value,TableVendaNumero.value]), []) then
Begin
M:=TableVendaDocumento.value;
R:=TableVendaNumero.Value;
TableVenda.cancel;
TableVenda.Locate('Documento;Numero', VarArrayOf([M,R]), []) ;
venda(Db1,Db2,Db3,EditDocumento,EditNumero,Editdata,DbGridVenda);
Db1.SetFocus;
end
Else
Begin
venda(Db1,Db2,Db3,EditDocumento,EditNumero,Editdata,DbGridVenda);
TableVendaData.Value:=Date;
Db1.SetFocus;
end;
end;
Gostei + 0
30/08/2010
Marco Salles
Gostei + 0
30/08/2010
Marcos Roberto
Eriley
Na linha
" If TableVenda.Locate('Documento;Numero',VarArrayOf([TableVendaDocumento.value,TableVendaNumero.value]),[]) then"
está dando os seguintes erros
[DCC Error] untVenda.pas(217): E2066 Missing operator or semicolon
[DCC Error] untVenda.pas(217): E2001 Ordinal type required
[DCC Error] untVenda.pas(217): E2010 Incompatible types: 'Integer' and 'AnsiString'
Tô sem entender nada !!!
Gostei + 0
31/08/2010
Leonardo Bertolini
Se vc quer verificar se a venda já existe, crie uma função que de um select no banco passando na cláusula where os codigos referente a venda.
Vc também pode rodar um loop no ClientDataSet e testar os campos para ver se algum registro bate com a venda.
Bom, lógico isso depende do tamanho da sua aplicação e da quantidade de registros envolvidos nessa tabela.
espero ter ajudado, abraços.
twitter.com/leobertolini
Gostei + 0
31/08/2010
Marcos Roberto
Pensando no que vc me passou, gostaria de tirar esta outra dúvida:
No formulario de Vendas os DbEdit´s estão relacionados com a CDSVenda, ou seja DBedit1 é o CDSVendaNUMERO.value quando da ativação do form um insert é feito neste CDS, então teremos um ponteiro indicando um novo registro.
Agora, quando usar a função para verificar se esta venda já existe e retornar um null o formulário perderá as informações já digitadas não é.
1) Poderia então eu fazer esta função dando o select em outro CDS para não bagunçar este form????
2) Como normalmente é feito esses forms ?: colocamos DBEdit´s ou simplesmente Edit´s e depois atribuir
todos Edit´s para a tabela e dar o post.
Grato
Gostei + 0
31/08/2010
Leonardo Bertolini
Existem várias formas de exibir dados pro usuário, alguns de desenvolvedores preferem utilizar simples edit's e atribuir o valor do campo ao edit.... outros preferem componentes DB que ja trazem direto o valor do campo.
Acredito que a primeira opção tenha uma performance melhor, mas dependendo do tamanho da sua aplicação torna-se irrelevante.
Quanto a sua verificação se a venda já existe, com certeza seria melhor usar um outro DataSet para verificar se a venda existe (nao usar os mesmo DataSet que esta relacionado aos edit's do form).
Qual tipo de conexão ao BD vc utiliza ? ADO ? DBExpress ? Zeos ? qual BD é ?
Gostei + 0
31/08/2010
Leonardo Bertolini
Assim se este outro DataSet não retornar nenhum registro vc sabe que a venda não existe, e ai vc pode fazer o que quiser dependendo do resultado.
Como tirar do modo de inserção o seu ClientDataSet
CDS.Cancel;
Gostei + 0
31/08/2010
Marcos Roberto
Valeu pela dica, vou verificar se o registro existe noutra CDS.
Uso Delphi 2010, DBExpress e Firebird.
SqlConnection, TClientDataSet, TSqlDataSet, TDataSetProvider e DataSource
Abraço.
Cara, outro problema: Quando insiro o terceiro item da venda dá um erro de chave violada, sendo que na tabela tem o seguinte trigger;
AS BEGIN
IF(NEW."CODIGO" IS NULL) THEN NEW."CODIGO" = GEN_ID("GEN_TITEMVEN_CODIGO",1);
END
Onde preciso mexer para fazer valer este trigger, com as outras tabelas sem mestre-detalhe não dão este erro.
Gostei + 0
31/08/2010
Leonardo Bertolini
Gostei + 0
31/08/2010
Eriley Barbosa
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)