Inserção de dados
Srs, na rotina abaixo, ao selecionar um produto para criar o certificado o sistema tem que fazer algumas atribuições e também inserir automaticamente no ´grid - Itens de controle do certificado´ todos os valores da tabela itens de controle do produto que é uma tabela ´filha´ da tabela produtos. Neste caso, estou passando como parâmetro para abertura do cds_itensdecontrole o codigo do produto que estou selecionando. Ao selecionar um produto e tentar inserir (click do botão ok) o delphi me exibe a seguinte mensagem de erro: ´SQLDA missing or incorrect version, or incorrect number/type of variables´. O programa compila sem nehum erro, mas está apresentando erros na execução. Solicito então encarecidamente a ajuda de vcs para tentar entender e resolver este erro.
Desde já, agradeço a todos vcs.
ps.: Utilizo Delphi7 + Firebird1.5 + DBExpress( Sqldataset, datasetprovider, clientdataset e sqlclientdataset).
[color=darkred:42b428e5da]//rotina
procedure TfrmCertificado.btn_setorClick(Sender: TObject);
begin
inherited;
if Dts.State=dsinactive then
begin
MessageDlg(´Oh! meu Deus, USUARIO COM PROBLEMA DE B-I-O-S !!!É preciso adicionar um novo, ou abrir um certificado antes de continuar!!!´,mtinformation,[mbok],0);
exit;
end;
frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert);
frmLocalizar.btn_procurar.Click;
try
if Frmlocalizar.ShowModal=mrOk then
begin
if Dts.State=dsbrowse then
dmdados.cds_certificados.Edit;
dmdados.cds_certificadosPRODUTO.AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_certificadosDESENHO.AsString:=dmdados.sqlcds_procura_prodcertDESENHO.AsString;
dmdados.cds_certificadosNOME_PRODUTO.AsString:=dmdados.sqlcds_procura_prodcertDESCRICAO.AsString;
dmdados.cds_certificadosMATPRIMA.AsInteger:=dmdados.sqlcds_procura_prodcertMATPRIMA.AsInteger;
dmdados.cds_certificadosNOME_MATERIAPRIMA.AsString:=dmdados.sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString;
dmdados.cds_certificadosCLIENTE.AsInteger:=dmdados.sqlcds_procura_prodcertCLIENTE.AsInteger;
dmdados.cds_certificadosNOME_CLIENTE.AsString:=dmdados.sqlcds_procura_prodcertNOME_CLIENTE.AsString;
end;
// rotina para inserir itens de controle do certificado
dmdados.cds_itensdecontrole.Close;
dmdados.cds_itensdecontrole.Params[1].AsInteger:=dmdados.cds_certificadosPRODUTO.AsInteger;
dmdados.cds_itensdecontrole.Open;
While not dmdados.cds_itensdecontrole.Eof do
begin
dmdados.cds_itenscertificado.Close;
dmdados.cds_itenscertificado.Open;
dmdados.cds_itenscertificado.Insert;
dmdados.cds_itenscertificadoCODIGO.Value:=dmdados.cds_itensdecontroleCODIGO.Value;
dmdados.cds_itenscertificadoPRODUTO.Value:=dmdados.cds_itensdecontrolePRODUTO.Value;
dmdados.cds_itenscertificadoCARACTERISTICA.Value:=dmdados.cds_itensdecontroleCARACTERISTICA.Value;
dmdados.cds_itenscertificadoESPECIFICACAO.Value:=dmdados.cds_itensdecontroleESPECIFICACAO.value;
dmdados.cds_itenscertificado.Post;
dmdados.cds_itensdecontrole.Next;
end;
dmdados.sqlcds_lista_itensdecontrole.Open;
// fim da rotina acima
finally
dmdados.sqlcds_procura_produtos.close;
Frmlocalizar.Free;
end;
end;
//fim da rotina[/color:42b428e5da]
Desde já, agradeço a todos vcs.
ps.: Utilizo Delphi7 + Firebird1.5 + DBExpress( Sqldataset, datasetprovider, clientdataset e sqlclientdataset).
[color=darkred:42b428e5da]//rotina
procedure TfrmCertificado.btn_setorClick(Sender: TObject);
begin
inherited;
if Dts.State=dsinactive then
begin
MessageDlg(´Oh! meu Deus, USUARIO COM PROBLEMA DE B-I-O-S !!!É preciso adicionar um novo, ou abrir um certificado antes de continuar!!!´,mtinformation,[mbok],0);
exit;
end;
frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert);
frmLocalizar.btn_procurar.Click;
try
if Frmlocalizar.ShowModal=mrOk then
begin
if Dts.State=dsbrowse then
dmdados.cds_certificados.Edit;
dmdados.cds_certificadosPRODUTO.AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_certificadosDESENHO.AsString:=dmdados.sqlcds_procura_prodcertDESENHO.AsString;
dmdados.cds_certificadosNOME_PRODUTO.AsString:=dmdados.sqlcds_procura_prodcertDESCRICAO.AsString;
dmdados.cds_certificadosMATPRIMA.AsInteger:=dmdados.sqlcds_procura_prodcertMATPRIMA.AsInteger;
dmdados.cds_certificadosNOME_MATERIAPRIMA.AsString:=dmdados.sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString;
dmdados.cds_certificadosCLIENTE.AsInteger:=dmdados.sqlcds_procura_prodcertCLIENTE.AsInteger;
dmdados.cds_certificadosNOME_CLIENTE.AsString:=dmdados.sqlcds_procura_prodcertNOME_CLIENTE.AsString;
end;
// rotina para inserir itens de controle do certificado
dmdados.cds_itensdecontrole.Close;
dmdados.cds_itensdecontrole.Params[1].AsInteger:=dmdados.cds_certificadosPRODUTO.AsInteger;
dmdados.cds_itensdecontrole.Open;
While not dmdados.cds_itensdecontrole.Eof do
begin
dmdados.cds_itenscertificado.Close;
dmdados.cds_itenscertificado.Open;
dmdados.cds_itenscertificado.Insert;
dmdados.cds_itenscertificadoCODIGO.Value:=dmdados.cds_itensdecontroleCODIGO.Value;
dmdados.cds_itenscertificadoPRODUTO.Value:=dmdados.cds_itensdecontrolePRODUTO.Value;
dmdados.cds_itenscertificadoCARACTERISTICA.Value:=dmdados.cds_itensdecontroleCARACTERISTICA.Value;
dmdados.cds_itenscertificadoESPECIFICACAO.Value:=dmdados.cds_itensdecontroleESPECIFICACAO.value;
dmdados.cds_itenscertificado.Post;
dmdados.cds_itensdecontrole.Next;
end;
dmdados.sqlcds_lista_itensdecontrole.Open;
// fim da rotina acima
finally
dmdados.sqlcds_procura_produtos.close;
Frmlocalizar.Free;
end;
end;
//fim da rotina[/color:42b428e5da]
Programalista
Curtidas 0
Respostas
Vinicius2k
15/09/2004
Colega,
Neste trecho :
Se este é o único parametro do cds_itenscontrole use :
ou
[b:b774d27651]Lembre-se ![/b:b774d27651] Os elementos do Array Params (e de quase todos os outros arrays definidos como propriedade) iniciam a contagem em [b:b774d27651]Zero[/b:b774d27651].
Espero ter ajudado...
T+
Neste trecho :
... // rotina para inserir itens de controle do certificado ... dmdados.cds_itensdecontrole.Params[1].AsInteger:=dmdados.cds_certificadosPRODUTO.AsInteger; ...
Se este é o único parametro do cds_itenscontrole use :
...Params[0].AsInteger...
ou
...Params.ParamByName(´nome_do_parametro´).AsInteger...
[b:b774d27651]Lembre-se ![/b:b774d27651] Os elementos do Array Params (e de quase todos os outros arrays definidos como propriedade) iniciam a contagem em [b:b774d27651]Zero[/b:b774d27651].
Espero ter ajudado...
T+
GOSTEI 0
Programalista
15/09/2004
Caro Vinicius2K, coloquei o ´nome do parâmetro´ como vc disse, mas o erro continua o mesmo.
Continuo aguardando alguma outra solução.
Continuo aguardando alguma outra solução.
GOSTEI 0
Vinicius2k
15/09/2004
Colega,
Que eu saiba, só existem duas possiblidades para este problema, e ambas relacionadas aos parametros, a primeira é seu nome e a segunda seu tipo de dado...
Já que não é a primeira, verifique o tipo de dado da coluna no Banco de Dados e o tipo de dado do parametro... no caso, vc está passando este parametro como [b:216388a3ba]Intege[/b:216388a3ba]r, o [b:216388a3ba]DataType[/b:216388a3ba] deste parametro está definido como [b:216388a3ba]ftInteger[/b:216388a3ba] ?
Faça esta verificação com os demais parametros, se existirem...
T+
Que eu saiba, só existem duas possiblidades para este problema, e ambas relacionadas aos parametros, a primeira é seu nome e a segunda seu tipo de dado...
Já que não é a primeira, verifique o tipo de dado da coluna no Banco de Dados e o tipo de dado do parametro... no caso, vc está passando este parametro como [b:216388a3ba]Intege[/b:216388a3ba]r, o [b:216388a3ba]DataType[/b:216388a3ba] deste parametro está definido como [b:216388a3ba]ftInteger[/b:216388a3ba] ?
Faça esta verificação com os demais parametros, se existirem...
T+
GOSTEI 0
Programalista
15/09/2004
Olá Vinicius, agora acertei o código, e o datatype do parâmetro está realmente como ftInteger. Não estão aparecendo mais nenhum erro, no entanto o resultado esperado não acontece: Desejo que ao selecionar o produto, para gerar um certificado para ele, sejam inseridos no ´grid - itens do certificado´, os itens de controle (da tabela itens de controle) do produto que estou selecionando, mas não está acontecendo nada. Imaginei que fosse apenas na aplicação, mas no banco de dados os dados também não são inseridos. [color=blue:81c24a50e0]Como fazer isto funcionar?[/color:81c24a50e0]
[color=darkred:81c24a50e0]procedure TfrmCertificado.btn_ProdutoClick(Sender: TObject);
begin
inherited;
if Dts.State=dsinactive then
begin
MessageDlg(´É preciso adicionar um novo, ou abrir um certificado antes de continuar!!!´,mtinformation,[mbok],0);
exit;
end;
frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert);
frmLocalizar.btn_procurar.Click;
try
if Frmlocalizar.ShowModal=mrOk then
begin
if Dts.State=dsbrowse then
dmdados.cds_certificados.Edit;
dmdados.cds_certificadosPRODUTO.AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_certificadosDESENHO.AsString:=dmdados.sqlcds_procura_prodcertDESENHO.AsString;
dmdados.cds_certificadosNOME_PRODUTO.AsString:=dmdados.sqlcds_procura_prodcertDESCRICAO.AsString;
dmdados.cds_certificadosMATPRIMA.AsInteger:=dmdados.sqlcds_procura_prodcertMATPRIMA.AsInteger;
dmdados.cds_certificadosNOME_MATERIAPRIMA.AsString:=dmdados.sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString;
dmdados.cds_certificadosCLIENTE.AsInteger:=dmdados.sqlcds_procura_prodcertCLIENTE.AsInteger;
dmdados.cds_certificadosNOME_CLIENTE.AsString:=dmdados.sqlcds_procura_prodcertNOME_CLIENTE.AsString;
// rotina para inserir itens de controle do certificado
dmdados.cds_itensdecontrole.close;
dmdados.cds_itensdecontrole.Params.ParamByName(´PRODUTO´).AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_itensdecontrole.Open;
While not dmdados.cds_itensdecontrole.Eof do
begin
dmdados.cds_itenscertificado.Close;
dmdados.cds_itenscertificado.Open;
dmdados.cds_itenscertificado.insert;
dmDados.cds_itenscertificadoCODIGO.Value:=dmdados.cds_itensdecontroleCODIGO.Value;
dmdados.cds_itenscertificadoCERTIFICADO.Value:=dmDados.cds_certificadosCODIGO.Value;
dmdados.cds_itenscertificadoPRODUTO.Value:=dmdados.cds_itensdecontrolePRODUTO.Value;
dmdados.cds_itenscertificadoCARACTERISTICA.Value:=dmdados.cds_itensdecontroleCARACTERISTICA.Value;
dmdados.cds_itenscertificadoESPECIFICACAO.Value:=dmdados.cds_itensdecontroleESPECIFICACAO.value;
dmdados.cds_itenscertificado.Post;
dmdados.cds_itensdecontrole.Next;
end;
dmdados.sqlcds_lista_itenscertificado.Close;
dmdados.sqlcds_lista_itenscertificado.Params.ParamByName(´PRODUTO´).Value:=dmdados.cds_certificadosPRODUTO.Value;
dmdados.sqlcds_lista_itenscertificado.Open;
// fim da rotina para inserir os itens de controle do certificado
end;
finally
dmdados.sqlcds_procura_produtos.close;
Frmlocalizar.Free;
end;
end;[/color:81c24a50e0]
[color=darkred:81c24a50e0]procedure TfrmCertificado.btn_ProdutoClick(Sender: TObject);
begin
inherited;
if Dts.State=dsinactive then
begin
MessageDlg(´É preciso adicionar um novo, ou abrir um certificado antes de continuar!!!´,mtinformation,[mbok],0);
exit;
end;
frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert);
frmLocalizar.btn_procurar.Click;
try
if Frmlocalizar.ShowModal=mrOk then
begin
if Dts.State=dsbrowse then
dmdados.cds_certificados.Edit;
dmdados.cds_certificadosPRODUTO.AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_certificadosDESENHO.AsString:=dmdados.sqlcds_procura_prodcertDESENHO.AsString;
dmdados.cds_certificadosNOME_PRODUTO.AsString:=dmdados.sqlcds_procura_prodcertDESCRICAO.AsString;
dmdados.cds_certificadosMATPRIMA.AsInteger:=dmdados.sqlcds_procura_prodcertMATPRIMA.AsInteger;
dmdados.cds_certificadosNOME_MATERIAPRIMA.AsString:=dmdados.sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString;
dmdados.cds_certificadosCLIENTE.AsInteger:=dmdados.sqlcds_procura_prodcertCLIENTE.AsInteger;
dmdados.cds_certificadosNOME_CLIENTE.AsString:=dmdados.sqlcds_procura_prodcertNOME_CLIENTE.AsString;
// rotina para inserir itens de controle do certificado
dmdados.cds_itensdecontrole.close;
dmdados.cds_itensdecontrole.Params.ParamByName(´PRODUTO´).AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger;
dmdados.cds_itensdecontrole.Open;
While not dmdados.cds_itensdecontrole.Eof do
begin
dmdados.cds_itenscertificado.Close;
dmdados.cds_itenscertificado.Open;
dmdados.cds_itenscertificado.insert;
dmDados.cds_itenscertificadoCODIGO.Value:=dmdados.cds_itensdecontroleCODIGO.Value;
dmdados.cds_itenscertificadoCERTIFICADO.Value:=dmDados.cds_certificadosCODIGO.Value;
dmdados.cds_itenscertificadoPRODUTO.Value:=dmdados.cds_itensdecontrolePRODUTO.Value;
dmdados.cds_itenscertificadoCARACTERISTICA.Value:=dmdados.cds_itensdecontroleCARACTERISTICA.Value;
dmdados.cds_itenscertificadoESPECIFICACAO.Value:=dmdados.cds_itensdecontroleESPECIFICACAO.value;
dmdados.cds_itenscertificado.Post;
dmdados.cds_itensdecontrole.Next;
end;
dmdados.sqlcds_lista_itenscertificado.Close;
dmdados.sqlcds_lista_itenscertificado.Params.ParamByName(´PRODUTO´).Value:=dmdados.cds_certificadosPRODUTO.Value;
dmdados.sqlcds_lista_itenscertificado.Open;
// fim da rotina para inserir os itens de controle do certificado
end;
finally
dmdados.sqlcds_procura_produtos.close;
Frmlocalizar.Free;
end;
end;[/color:81c24a50e0]
GOSTEI 0
Vinicius2k
15/09/2004
Colega,
A princípio, nada me parece de errado nas rotinas de inserção, mas neste trecho :
Como vc tem várias ações que devem ser tomadas baseadas neste desvio (if) vc precisa delimitá-las com begin...end;
Veja :
Veja se este é o problema....
:idea: Dica : ao postar um código utilize as tags ...{/code}*
* O correto é [ -- colchetes, mas usei chaves para poder exemplificar...
Usando as tags facilita a vida de quem quer lhe ajudar... :wink:
T+
A princípio, nada me parece de errado nas rotinas de inserção, mas neste trecho :
... if Dts.State=dsbrowse then dmdados.cds_certificados.Edit; ...
Como vc tem várias ações que devem ser tomadas baseadas neste desvio (if) vc precisa delimitá-las com begin...end;
Veja :
procedure TfrmCertificado.btn_ProdutoClick(Sender: TObject); begin inherited; if Dts.State=dsinactive then begin MessageDlg(´É preciso adicionar um novo, ou abrir um certificado antes de continuar!!!´,mtinformation,[mbok],0); exit; end; frmLocalizar:=TfrmLocalizar.Create(self,dmdados.sqlcds_procura_prodcert); frmLocalizar.btn_procurar.Click; try if Frmlocalizar.ShowModal=mrOk then begin if Dts.State=dsbrowse then begin with dmdados do begin cds_certificados.Edit; cds_certificadosPRODUTO.AsInteger:= sqlcds_procura_prodcertCODIGO.AsInteger; cds_certificadosDESENHO.AsString:= sqlcds_procura_prodcertDESENHO.AsString; cds_certificadosNOME_PRODUTO.AsString:= sqlcds_procura_prodcertDESCRICAO.AsString; cds_certificadosMATPRIMA.AsInteger:= sqlcds_procura_prodcertMATPRIMA.AsInteger; cds_certificadosNOME_MATERIAPRIMA.AsString:= sqlcds_procura_prodcertNOME_MATERIAPRIMA.AsString; cds_certificadosCLIENTE.AsInteger:= sqlcds_procura_prodcertCLIENTE.AsInteger; cds_certificadosNOME_CLIENTE.AsString:= sqlcds_procura_prodcertNOME_CLIENTE.AsString; // rotina para inserir itens de controle do certificado cds_itensdecontrole.close; cds_itensdecontrole.Params.ParamByName(´PRODUTO´).AsInteger:=dmdados.sqlcds_procura_prodcertCODIGO.AsInteger; cds_itensdecontrole.Open; while not cds_itensdecontrole.Eof do begin cds_itenscertificado.Close; cds_itenscertificado.Open; cds_itenscertificado.insert; cds_itenscertificadoCODIGO.Value:= cds_itensdecontroleCODIGO.Value; cds_itenscertificadoCERTIFICADO.Value:= cds_certificadosCODIGO.Value; cds_itenscertificadoPRODUTO.Value:= cds_itensdecontrolePRODUTO.Value; cds_itenscertificadoCARACTERISTICA.Value:= cds_itensdecontroleCARACTERISTICA.Value; cds_itenscertificadoESPECIFICACAO.Value:= cds_itensdecontroleESPECIFICACAO.value; cds_itenscertificado.Post; cds_itensdecontrole.Next; end; sqlcds_lista_itenscertificado.Close; sqlcds_lista_itenscertificado.Params.ParamByName(´PRODUTO´).Value:= cds_certificadosPRODUTO.Value; sqlcds_lista_itenscertificado.Open; // fim da rotina para inserir os itens de controle do certificado end; end; end; finally dmdados.sqlcds_procura_produtos.close; Frmlocalizar.Free; end; end;
Veja se este é o problema....
:idea: Dica : ao postar um código utilize as tags ...{/code}*
* O correto é [ -- colchetes, mas usei chaves para poder exemplificar...
Usando as tags facilita a vida de quem quer lhe ajudar... :wink:
T+
GOSTEI 0