Ir para conteúdo
Fórum Script Brasil
  • 0

Gravar multiselect da grid [Resolvido]


Nacht Byte

Pergunta

Bom pessoal,

Só pra explicar melhor, tenho um form de cadastro, e nele eu cadastro os registros, seleciono o produto e automaticamente aparece os componentes do produto na grid. Até ae tudo bem, agora preciso por exemplo selecionar mais que uma linha na grid e gravar no bd(em uma tabela com chave composta).

Alguém dá uma luz?

tentei dessa forma no botão gravar mas não deu nada.

procedure TFRM_CadastroChamado.btnGravarClick(Sender: TObject);
var
  contador: Integer;
begin
  inherited;
With dbgrd1 do
Begin
for contador:= 0 to Pred(SelectedRows.Count) do
Begin
cdsComponente.Bookmark:= SelectedRows[contador];
end;
end;

Editado por Nacht Byte
Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

no dbgrid na propriedade Options > dgMultiSelect = true para que possa selecionar mais de um registro

mantenha pressionada a tecla Ctrl e clique com o mouse nos registros que farão parte da lista ( Bookmark )

exemplo de uso ... gravando os registros selecionados em outra tabela

for cont:= 0 to Pred(SelectedRows.Count) do
        Begin
          Datasource.Dataset.Bookmark:= SelectedRows[cont];

          CDS_Etiqueta.Last;
          CDS_Etiqueta.Insert;
          CDS_Etiqueta.Edit;

          j := j + 1;
          CDS_EtiquetaITEM.Value       := j;
          CDS_EtiquetaCODIGO_FS.Value  := TCadLivroxCODIGO_FS.Value;
          CDS_EtiquetaAUTOR.Value      := TCadLivroxAUTOR.Value;
          CDS_EtiquetaTITULO.Value     := TCadLivroxTITULO.Value;

          CDS_Etiqueta.Post;

        end;
      CDS_Etiqueta.ApplyUpdates(-1);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

segue o código modificado a minha causa:

var
  cont:Integer;
begin
  inherited;
for Cont:= 0 to Pred(SelectedRows.Count) do
        Begin
          Datasource.Dataset.Bookmark:= SelectedRows[cont];

          cdsChamadoComp.Last;
          cdsChamadoComp.Insert;
          cdsChamadoComp.Edit;

          cdsChamadoCompCOD_CHAMADO.Value  := cdsCadastroCODIGO.Value;
          cdsChamadoCompCOD_COMPONENTE.Value      := cdsComponenteCODIGO.Value;

          cdsChamadoComp.Post;

        end;
      cdsComponente.ApplyUpdates(-1);
end;

Porem da erro nesse parte:

for Cont:= 0 to Pred(SelectedRows.Count) do

[Error] u_FRM_CadastroChamado.pas(290): Undeclared identifier: 'SelectedRows'

Link para o comentário
Compartilhar em outros sites

  • 0
[Error]u_FRM_CadastroChamado.pas(290): Undeclared identifier: 'SelectedRows'

declare:

uses dbgrids;


var cont : integer

begin

   With Dbgrid1 do
   Begin
     if SelectedRows.Count = 0 then
        begin
           MessageDlg('OPERAÇÃO ANULADA! '+ #13 + #13 +
                      'SELECIONE OS REGISTROS.' , mtInformation, [mbOK], 0);

           DBGrid1.SetFocus;
           Exit;
        end;

     for Cont:= 0 to Pred(SelectedRows.Count) do
        Begin
          Datasource.Dataset.Bookmark:= SelectedRows[cont];

          cdsChamadoComp.Last;
          cdsChamadoComp.Insert;
          cdsChamadoComp.Edit;

          cdsChamadoCompCOD_CHAMADO.Value  := cdsCadastroCODIGO.Value;
          cdsChamadoCompCOD_COMPONENTE.Value      := cdsComponenteCODIGO.Value;

          cdsChamadoComp.Post;

        end;
      cdsComponente.ApplyUpdates(-1);
end;

Como chamarei a rotina pra ficar marcado os items que gravei?

de o nome que quiser ... exempo: Adicionar_a_Lista

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Estranho...

Fiz o que você colocou mas nada foi gravado na tabela CHAMADOCOMPONENTE (cdsChamadoComp)

Será que não é esse cdsComponente.ApplyUpdates(-1);?

QUOTE

Como chamarei a rotina pra ficar marcado os items que gravei?

de o nome que quiser ... exempo: Adicionar_a_Lista

abraço

desculpa a ignorância, mas, como assim?

Link para o comentário
Compartilhar em outros sites

  • 0
Será que não é esse cdsComponente.ApplyUpdates(-1);?

tambem não tinha reparado

cdsChamadoComp.ApplyUpdates(-1);

a sua pergunta

Como chamarei a rotina pra ficar marcado os items que gravei?

voce quer um nome para a rotina ? ou quer dizer como chamar essa rotina pelo programa ?

se for um nome .. voce escolhe

ser for a chamada da rotina , basta colocar o código dentro de um botão

procedure TFRM_CadastroChamado.btnGravarClick(Sender: TObject);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, consegui gravar no banco.

Agora só preciso saber como visualizar o que as linhas que foi salva.

Por exemplo, abro o cadastro tal e ele aparece os registros e as row da grid que foi gravada anteriormente.

porque ele tá gravando no banco, só que quando abro o cadastro as rows não ficam marcadas.

Editado por Nacht Byte
Link para o comentário
Compartilhar em outros sites

  • 0

o uso do Bookmark é para selecionar determinados registros de uma tabela, podendo ser salvos em outra tabela ou utilizados de maneira dinâmica... por exemplo: no caso de emitir etiquetas

se os registros foram salvos em uma tabela temporária, voce trabalha com esses registros da maneira que desejar

entretanto as marcações do Bookmark se perdem ao fechar e abrir novamente a tabela ... se quer um controle maior em cima dos registros selecionados, terá que usar outra lógica para isso

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Segue uma imagem pra explicar melhor.

imagemdt.jpg

observe na parte de componentes. Esse cadastro já tá salvo e eu marquei a linha Teste (A primeira) e a teste90000 e foram gravadas no banco. Só que quando abro essa janela pra editar essas linhas ficam desmarcadas ( como mostra a imagem). teria como ao abrir o registro as linhas ficassem marcadas pra mostrar que foi gravada?

Link para o comentário
Compartilhar em outros sites

  • 0
observe na parte de componentes. Esse cadastro já tá salvo e eu marquei a linha Teste (A primeira) e a teste90000 e foram gravadas no banco. Só que quando abro essa janela pra editar essas linhas ficam desmarcadas ( como mostra a imagem). teria como ao abrir o registro as linhas ficassem marcadas pra mostrar que foi gravada?

até é possivel, mas daria muito mais trabalho, pois voce teria que guardar a posição de cada registro dentro do DBgrid para depois torna-los a usar novamente para marcar os mesmos registros ...

nesse caso é mais facil utilizar uma tabela temporaria, onde voce veria todos os registros selecionados anteriormente e trabalharia exclusivamente com eles.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
E como seria a rotina pra essa tabela temporária? porque eu já uso uma tabela exclusivamente para guardar os valores escolhidos na grid.

então não é preciso, use a própria tabela que voce já usa ... seria a mesma coisa

só veja como pretende usar esses registros no seu programa

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
eu já uso uma tabela exclusivamente para guardar os valores escolhidos na grid.

pelo que eu entendi o DBGrid com o titulo Descrição é a tabela que voce quer usar para fazer o Bookmark e ai pegar os registros selecionados e jogar em outra tabela ?

ou ela já é a tabela com registros que foram selecionados de outra tabela ?

Link para o comentário
Compartilhar em outros sites

  • 0
Acabei colocando uma Grid pra visualizar o que eu selecionei na outra grid.

Só tem um problema, os registros não se separam pelo código. Aparece todos os componentes que registrei.

Se a sua grid for essa ( DBGrid1 ) e cdsChamadoComp pertencer a uma tabela vazia, voce vai ter nessa grid somente os registros selecionados

uses dbgrids;


var cont : integer

begin

   With Dbgrid1 do
   Begin
     if SelectedRows.Count = 0 then
        begin
           MessageDlg('OPERAÇÃO ANULADA! '+ #13 + #13 +
                      'SELECIONE OS REGISTROS.' , mtInformation, [mbOK], 0);

           DBGrid1.SetFocus;
           Exit;
        end;

     for Cont:= 0 to Pred(SelectedRows.Count) do
        Begin
          Datasource.Dataset.Bookmark:= SelectedRows[cont];

          cdsChamadoComp.Last;
          cdsChamadoComp.Insert;
          cdsChamadoComp.Edit;

          cdsChamadoCompCOD_CHAMADO.Value  := cdsCadastroCODIGO.Value;
          cdsChamadoCompCOD_COMPONENTE.Value      := cdsComponenteCODIGO.Value;

          cdsChamadoComp.Post;

        end;
      cdsChamadoComp.ApplyUpdates(-1);
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Amigo, isso eu sei...

Só que o problema é que ele não separa por código de chamado.

Eu preencho um chamado e seleciono os componentes. Ele salva e aparece na GRID, só que quando vou preencher outro chamado e salvo os componentes se unem aos componentes que salvei no outro chamado.

O que eu quero é que os componentes sejam visualizados de acordo com o código do chamado.

Isso seria pelo where da query, porém não tive sucesso.

Alguma sugestão?

Editado por Nacht Byte
Link para o comentário
Compartilhar em outros sites

  • 0
Eu preencho um chamado e seleciono os componentes. Ele salva e aparece na GRID, só que quando vou preencher outro chamado e salvo os componentes se unem aos componentes que salvei no outro chamado.

limpe os registros antes de salvar novamente

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Assim?

With dbgrd1 do
   Begin
     if SelectedRows.Count = 0 then
        begin
           MessageDlg('Operação Anulada! '+ #13 + #13 +
                      'Selecione os componentes.' , mtInformation, [mbOK], 0);

           dbgrd1.SetFocus;
           Exit;
        end;

     for Cont:= 0 to Pred(SelectedRows.Count) do
        Begin
          Datasource.Dataset.Bookmark:= SelectedRows[cont];

          cdsChamadoComp.Last;
          cdsChamadoComp.Insert;
          cdsChamadoComp.Edit;

          cdsChamadoCompCOD_CHAMADO.Value       := cdsCadastroCODIGO.Value;
          cdsChamadoCompCOD_COMPONENTE.Value    := cdsComponenteCODIGO.Value;

          cdsChamadoComp.Post;

        end;
      cdsChamadoComp.ApplyUpdates(-1);
      dbgrd1.Columns.Clear;
      cdsChamadoComp.ClearFields;
      cdsChamadoComp.Close;
      cdsChamadoComp.Open;

Link para o comentário
Compartilhar em outros sites

  • 0
cdsChamadoComp.ApplyUpdates(-1);

dbgrd1.Columns.Clear;

cdsChamadoComp.ClearFields;

cdsChamadoComp.Close;

cdsChamadoComp.Open;

ClearFields depois de um ApplyUpdates, não deve ter dado muito certo ...

veja um exemplo

With dbgrd1 do
   Begin
     if SelectedRows.Count = 0 then
        begin
           MessageDlg('Operação Anulada! '+ #13 + #13 +
                      'Selecione os componentes.' , mtInformation, [mbOK], 0);

           dbgrd1.SetFocus;
           Exit;
        end;

    cdsChamadoComp.EmptyDataSet;   //  ou outra rotina para limpar os registros 

     for Cont:= 0 to Pred(SelectedRows.Count) do
        Begin
          Datasource.Dataset.Bookmark:= SelectedRows[cont];

          cdsChamadoComp.Last;
          cdsChamadoComp.Insert;
          cdsChamadoComp.Edit;

          cdsChamadoCompCOD_CHAMADO.Value       := cdsCadastroCODIGO.Value;
          cdsChamadoCompCOD_COMPONENTE.Value    := cdsComponenteCODIGO.Value;

          cdsChamadoComp.Post;

        end;
      cdsChamadoComp.ApplyUpdates(-1);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

agora entendi o seu poblema ... no evento OnClick do DBgrid, voce deve executar um select em uma query para filtrar apenas esse registro ou qualquer outro, a não ser que os outros componentes estejam linkados ao mesmo DataSource do DBgrid

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

um exemplo:

imagine uma Tabela contendo os seguintes campos:

COD integer NOME varchar(50)

0001 ..................ANTONIO

0002...................PEDRO

0003...................JOAO

0004...................MARCOS

abra um novo projeto

coloque no form um componente Query, um DataSource, um DBgrid, um Edit e 2 Buttons

ligue o datasource ao query e ao dbgrid

na SQL da query por exemplo coloque:

select * from tabela
no Onclick do button1 voce ativa essa query
query1.active := false;
query1.active := true;
devera aparecer no dbgrid todos os registros dessa tabela no button 2 vamos fazer nova seleçao só que dessa vez vamos restringir a pesquisa no Onclick do button 2
query1.active := false;
query1.SQL.Clear;
query1.SQL.append('Select * from Tabela where NOME = ' + ''''JOAO'''' );
query1.active := true

voce devera ver no DBgrid apenas o registro do JOAO

COD integer NOME varchar(50)

0003...................JOAO

----------------------------------------------------------------------

CONCLUSÃO : ao clicar no button 1 eu tenho todos os registros da minha tabela, ao clicar no button 2 eu selecionei um especifico que me interessava ... se eu tiver DBEdits com os respctivos campos da minha tabela, eu verei todos os dados desse resgistro.

Isso é apenas um exemplo, voce deve seguir o mesmo raciocinio para o seu programa ... se tiver duvidas o forum dispõe de apostilas que o ajudarão a entender melhor

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde,

Tentarei fazer esse molde no Onshow do cadastro para exibir

Tentei isso no Onshow e não mudou nada

sqlChamadoComp.active := false;
sqlChamadoComp.SQL.Clear;
sqlChamadoComp.SQL.append('Select COD_CHAMADO, COD_COMPONENTE, DESCRICAO FROM CHAMADOCOMPONENTE, CHAMADO where CHAMADOCOMPONENTE.COD_CHAMADO=CHAMADO.CODIGO');
sqlChamadoComp.active := true

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...