Array
(
)

Inserção de dados

Programalista
   - 15 set 2004

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).

//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


Vinicius2k
   - 15 set 2004

Colega,

Neste trecho :
#Código

...
// 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 :
#Código
...Params[0].AsInteger...

ou
#Código
...Params.ParamByName(´nome_do_parametro´).AsInteger...


Lembre-se ! Os elementos do Array Params (e de quase todos os outros arrays definidos como propriedade) iniciam a contagem em Zero.

Espero ter ajudado...
T+


Programalista
   - 15 set 2004

Caro Vinicius2K, coloquei o ´nome do parâmetro´ como vc disse, mas o erro continua o mesmo.

Continuo aguardando alguma outra solução.


Vinicius2k
   - 15 set 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 Integer, o DataType deste parametro está definido como ftInteger ?
Faça esta verificação com os demais parametros, se existirem...

T+


Programalista
   - 16 set 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. Como fazer isto funcionar?


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;


Vinicius2k
   - 16 set 2004

Colega,

A princípio, nada me parece de errado nas rotinas de inserção, mas neste trecho :
#Código

... 
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 :
#Código
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}...{/code}*
* O correto é [ -- colchetes, mas usei chaves para poder exemplificar...
Usando as tags facilita a vida de quem quer lhe ajudar... :wink:

T+