Fórum update processo setstatus=´R´ where ?????? #371331
17/06/2009
0
Tenho um formulário para inserir dados na tabela HISTORICO com os campos:
Tipo de Movimentação (COMBO)
Data (DBDataEdit)
Nome (Dblookupcombobox q traz os nomes da tabela PROCESSO)
Obs(DBMemo)
A questão é que conforme o ´Tipo de Movimentação´ (recebido=R ou devolvido=D), tenho que mudar o campo ´Status´ da tabela PROCESSO para ´R´ ou ´D´ no registro escolhido no dblookup.
Estou tentando fazer o update mas na hora do where estou me perdendo.
DataModule2.ADOQAlteraStatus.Close;
DataModule2.ADOQAlteraStatus.SQL.Clear;
DataModule2.ADOQAlteraStatus.SQL.Add(´UPDATE PROCESSO SET STATUS=´´R´´´);
DataModule2.ADOQAlteraStatus.SQL.Add(´WHERE PROCESSO.NOME=??????????´);
DataModule2.ADOQAlteraStatus.Open;
DataModule2.ADOQAlteraStatus.Active:=True;
Ajudem-me
Edilsonlima
Curtir tópico
+ 0Posts
18/06/2009
.lg.
sua tabela de histórico deve ter um campo ´código´.
A condição será apenas para identificar qual dos registros vc estará alterando o status pra um novo valor. Sua query ficaria assim dentro do ADOQuery:
UPDATE PROCESSO SET STATUS = :VALOR WHERE CODIGO = :CODIGO
Onde na query seus parâmetros serão:
- ´:VALOR´ = Seria o ´R´ ou o ´D´, isso é passado para o parâmetro, logo falarei como.
- ´:CODIGO´ = O código referente a aquele registro. Como eu falei todo registro tem um identificador para que você possa tratar os registros.
Antes de lhe falar como passar os parâmetros... 2 observações:
1. Na query, quando você chama a tabela (UPDATE [b:23e7a82d86]PROCESSO[/b:23e7a82d86]...), você não precisa identificar o campo seguido da tabela ([b:23e7a82d86]PROCESSO.NOME[/b:23e7a82d86]), a query já entende que o campo ´nome´ pertence a aquela tabela do update que você está dando. Agora é so um conselho. Cada um programa de uma maneira, você pode usar, ou não.
2. Quando você dá um ´.open´ num ADOQuery, você está ativando ela. Ou seja...
Para se passar os parâmetros... com o seu ADOQuery já com o SQL definido dentro dele, seu código ficaria assim:
with DataModule2 do begin ADOQAlteraStatus.Close; ADOQAlteraStatus.Parameters.ParamByName(´VALUE´).Value := ´R´;//poderia fazer uma validação para passar R ou D pelo que vc mencionou ADOQAlteraStatus.Parameters.ParamByName(´CODIGO´).Value = IdentificadorDoRegistro; ADOQAlteraStatus.Open; end;
Lembre-se que onde eu escrevi ´IdentificadorDoRegistro´, é o identificador que diz, ´A registro da tabela tal que você quer é este!´. Entende!?
Qualquer dúvida pode perguntar.
Espero que ajude.
Att,
.lg.
Gostei + 0
18/06/2009
Edilsonlima
continuo sem enteder muito bem e fiz várias tentativas de várias formas com base no que vc postou.
Realmente a tabela HISTORICO tem um campo ´COD_PROCESSO´ que se relaciona com o campo, de mesmo nome, da tabela PROCESSO.
gostaria que o amigo verificasse, pois está assim:
SQL na ADOQAlteraStaus
UPDATE PROCESSO
SET STATUS = ´R´
WHERE CODIGO COD_PROCESSO = COD_PROCESSO ??????
e no botão gravar
.....
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ´COD_PROCESSO´;
ADOQAlteraStatus.Open;
end
Aguardo resposta e desde já agradeço
Gostei + 0
19/06/2009
.lg.
vamos aos fatos:
- Todo parâmetro é definido com [b:bd4f1d0f95]dois pontos ( : )[/b:bd4f1d0f95]. Você define um parâmetro para passar um valor no lugar dele. ex.:
:CODIGO
- No seu código... seu update ficaria assim:
UPDATE PROCESSO SET STATUS = ´R´ WHERE COD_PROCESSO = :COD_PROCESSO
- No script, So passe valor para parâmetros que foram definidos. No seu componente ADOQuery, você pode verificar quantos parâmetros existem, ao clicar 2x na propriedade (do objectInspector) [b:bd4f1d0f95]Parameters[/b:bd4f1d0f95]. Irá abrir uma caixinha lhe mostrando os parâmetros existentes. [color=red:bd4f1d0f95]OBS.: Não mude nenhum valor deles nessa telinha. Apenas visualize.[/color:bd4f1d0f95]
- Se você quer não for validar e for deixar o select já com a atribuição [color=blue:bd4f1d0f95]R[/color:bd4f1d0f95] para o campo status, então use a query que coloquei acima. Se você for validar como você mesmo fez no seu script:
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
Então use este script:
with DataModule2 do begin if (Trim(DbLooupCmbBoxMovimentacao.Text) = ´RECEBIDO´) then begin ADOQAlteraStatus.Close; ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´; ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQueryCOD_PROCESSO.Value; ADOQAlteraStatus.Open; end else if (Trim(DbLooupCmbBoxMovimentacao.Text) = ´DEVOLVIDO´) then begin ADOQAlteraStatus.Close; ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´D´; ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQueryCOD_PROCESSO.Value; ADOQAlteraStatus.Open; end; end;
E esta query:
UPDATE PROCESSO SET STATUS = :STATUS WHERE COD_PROCESSO = :COD_PROCESSO
LEMBRANDO: so porque eu coloquei [color=red:bd4f1d0f95]ADOQueryCOD_PROCESSO.Value[/color:bd4f1d0f95], não significa que você vai colocar isso não. Você deve procurar em qual query ou em qual variável está armazenado o valor do código do registro da tabela [color=blue:bd4f1d0f95]PROCESSO[/color:bd4f1d0f95] que você quer que altere.
E mais uma vez: Pegue uma apostila de SQL básico e faça mais treinos em delphi. Você está precisando de alguns treinamentos. tem muito erro de sintax no seu código e linha atoa. Falo isso por bem.
Qualquer coisa basta falar que ajudamos.
Abraços,
.lg.
Gostei + 0
19/06/2009
Edilsonlima
Espero q vc não se zangue comigo, mas continuo com problema. Realmente tenho que estudar mais (aceito sugestão de apostilas caso tenha alguma). Por enquanto, caso o amigo, ainda esteja disposto aa juadar. Fiz exatamente como vc disse e esclareço:
realmente na caixinha de parameters da ADOQAlteraStatus, aparece
STATUs e COD_PROCESSO
pois a SQL coloquei exatamente como vc disse.
O código ficou assim:
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then
begin
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´R´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
ADOQAlteraStatus.Open;
end
else
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´DEVOLVIDO´) then
begin
ADOQAlteraStatus.Close;
ADOQAlteraStatus.Parameters.ParamByName(´STATUS´).Value := ´D´;
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoNOME.Value;
ADOQAlteraStatus.Open;
end
end
e na execução quando clico no botão gravar, retorna a mensagem:
´O procedor atual não oferece suporte para retornar vários conjuntos de registros de uma única execução´.
Espero ajuda e desde já agradeço.
Gostei + 0
19/06/2009
Edilsonlima
ADOQAlteraStatus.Parameters.ParamByName(´COD_PROCESSO´).Value := [b:06165e3f4c]ADOQNomeProcessoCOD_PROCESSO[/b:06165e3f4c].Value;
coloquei a query acima, pois foi com ela que extrair os nomes para o dblookup, mesmo assim já que pretendo é modificar o campo STATUS da tabela Processo, substiuir por [b:06165e3f4c]ADOTProcessoCOD_PROCESSO[/b:06165e3f4c].
Executei das duas formas e mesmo assim...
Gostei + 0
19/06/2009
.lg.
Acredito que este seja o campo que você deve colocar. Olhou certo. Pelo nome eu suponho que seja.
Vamos fazer uma substituição de componentes...
Pegue a query (copie). Exclua o componente ADOQuery que você colocou pra isso. Normalmente, para [color=blue:309adfdfa1]UPDATE[/color:309adfdfa1], [color=blue:309adfdfa1]INSERT[/color:309adfdfa1] e [color=blue:309adfdfa1]DELETE[/color:309adfdfa1] eu costumo usar o componente [color=darkblue:309adfdfa1]ADOCommand[/color:309adfdfa1].
A única coisa que muda dele pro query, é que aonde você coloca a query é na propriedade [b:309adfdfa1]CommandText[/b:309adfdfa1].
E no script substitua o ADOQuery por ADOCommand (no caso seria o nome que vc vai da pra ele.) Command não precisa dos commandos [b:309adfdfa1]Close;[/b:309adfdfa1] e [b:309adfdfa1]Open;[/b:309adfdfa1]
ex.:
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´R´; //E assim vai quantos parâmetros tiver. //e pra executar use: acmUpdProcesso.Execute;
É até mais simples.
Qualquer dúvida, pode perguntar.
.lg.
Gostei + 0
20/06/2009
Edilsonlima
Fiz exatamente como vc disse.
Coloquei o ADOCommand, passei a SQL da Query anterior para ele na propriedade Command text e verifiquei a propriedade parameters e na janela mosta os parametros STATUS e COD_Processo
No código ficou assim:
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then begin
acmUpdProcesso.Parameters.ParamByName(´STATUS´).Value := ´R´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOTProcessoSTATUS.Value;
acmUpdProcesso.Execute;
end else
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´DEVOLVIDO´) then begin
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´D´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOTProcessoSTATUS.Value;
acmUpdProcesso.Execute;
end;
Agora qdo executo não aparece erro algum, porém o STATUS na tabela PROCESSO fica inalterado.
o que será q tá errado desta vez?
Gostei + 0
22/06/2009
.lg.
Você pode dar um update novamente que vai funcionar.
Um conselho:
Abra o SQL management e use a interface do sql para testar as sentenças sql antes de usa-las. isso lhe ajuda a ver se o sql está correto ou errado. Se vai dar certo ou não. Lembrando que no studio do SQL... as query´s não entendem parâmetros, então troque os parâmetros pelos seus respectivos valores.
Lembre-se... Apenas para teste. O melhor seria se vc criasse uma base identica a que vc está usando na aplicação, na sua máquina local. Assim você não altera diretamente no banco de dados do servidor.
Aguardo retorno.
.lg.
Gostei + 0
23/06/2009
Edilsonlima
with DataModule2 do begin
if (Trim(DbLookupCmbBoxMovimentacao.Text) =´RECEBIDO´) then begin
acmUpdProcesso.Parameters.ParamByName(´STATUS´).Value := ´R´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
acmUpdProcesso.Execute;
end else
begin
acmUpdProcesso.parameters.ParamByName(´STATUS´).Value := ´D´;
acmUpdProcesso.Parameters.ParamByName(´COD_PROCESSO´).Value := ADOQNomeProcessoCOD_PROCESSO.Value;
acmUpdProcesso.Execute;
end;
Muito obrigado pela ajuda..
Gostei + 0
24/06/2009
.lg.
Abraços,
.LG.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)