Array
(
)

Varios Comando ZQuery

Leandro Maia
   - 16 nov 2009

Olá pessoal, olha eu aqui mais uma vez, queria a ajuda de vcs, tenho o seguinte problema, em uma aplicacao que eu desenvolvi eu tenho que cadastrar os itens, e para agilizar o servico eu tenho que ja inserir as observacoes de cada iten(pode ser 0, 1 ou mais observacoes), por isso tenho a tabela Cad_Itens(codigo int not null primary key auto_increment, ....) e a tabela Cad_Observacoes_Itens(codigo int not null primary key auto_increment, cod_itens int not null foreign key references Cad_Itens(codigo),cod_observacao int not null foreign key references cad_observacao(codigo),...). Na hora que eu vou gravar o item eu ja tenho um clientdataset com todos os dados das observacoes dos itens.

O problema e o seguinte, pra eu vincular o registro da observacao na tabela de itens eu poderia fazer da seguinte forma:

var aux:string;

zquery.close;
zquery.sql.text:='insert into Cad_Itens (...) values (...)';
zquery.execsql;

zquery.close;
zquery.sql.text:='select max(codigo) from Cad_Itens';
zquery.open;

aux:=zquery.fields[0].asstring;

zquery.close;
zquery.sql.text:='insert into Cad_Observacoes_Itens(cod_itens,cod_Observacoes) values('''+aux+''','''+valor+''')';
zquery.execsql;

Isso funciona, porem existe o risco de se fazer o vinculo a um registro errado, pois se duas aplicacoes fizerem a mesma requisicao ao mesmo tempo isso pode ocorrer. Dai comecei a pesquizar uma solucao pra isso, encontrei a seguinte function last_insert_id(), ela funciona, so q existe um problema, essa funcao tem que ser passada junto com outro comando pra poder funcionar, por exemplo:

insert into(...) values(...); select last_insert_id();

dessa forma a posibilidade retornar outro registro é 0.
Mas o problema e o seguinte, o componente zquery nao aceita(ou se aceita eu nao consegui fazer aceitar) mais de uma comando sql, pra isso usa-se o componente zsqlprocessor, esse componente(zsqlprocessor) roda scripts, mas preciso recuperar o last_insert_id, nesse componente eu acho que nao tem como retornar valor, dai vem a duvida, tem como fazer isso com algum componente zeos?

Maykon Stinglin
   - 18 nov 2009

Amigo, tenho o mesmo problema que vocë e enquanto nao temos uma solucao para isto vou te explicar oque eu fiz.

Basicamente seria usando o max(codigo), porem com uma diferenca. Todos acessam o sistema com um login e senha, e para cada operacao ( tabela do sistema) eu tenho o campo com o nome do usuario que criou o registro.
Entao apos um inserte, podemos fazer max(codigo) where usuario =  X  .. dai vc vai ter o ultimo registro inserido por aquele usario.

Repito, esta nao e a melhor solucao, e mais um quebra galho. Continuo pesquisando uma melhor solucao.