ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

DbGrid

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
28440959842
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 166

MensagemEnviada: Sex Dez 21, 2012 8:12 pm    Assunto: DbGrid Responder com Citação

Amigos!

Me desculpe a insistência, mas ainda estou com a dúvida do DBGrid que está me consumindo, já perguntei para vários desenvolvedores, algumas vezes aqui no forum, mas acho que não me fiz entender direito, vou tentar detalhar o máximo:

o que fiz:

No form coloquei uma dbgrid, um conexão ADO, uma query, e um DS.

Liguei a query na conexão ADO, a query no DS, e por final o DS liguei no DBGrid, onde me mostrou as informações que tinha na query.

Se eu digitar diretamente as informações na Grid, e dar seta para baixo, estas informações são gravadas imediatamente no banco.


Agora vem a minha dúvida:

queria digitar no DBGrid, mas só gravar quando eu executar um botão, ou seja, preencho três, quatro linhas, e depois executo o botão, ai sim dou um post.

Pois fiz uma tela de entrada de documentos, onde via edit eu coloco o cabeçalho, e tenho um botão que habilita a grid enable:=true.

Mas ai vou digitando os produtos na grid, mas ela já vai gravando no banco de dados,e se precisar alterar a linha de cima, apresenta erros, a linha nao está em modo de inserção, etc, uma dor de cabeça só.

Gostaria de ouvir a opinião dos amigos sobre isso, continuo com dbgrid, uso string grid (da para digitar e depois salvar?).

Espero encarecidamente da ajuda de vocês!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Sex Dez 21, 2012 8:58 pm    Assunto: Responder com Citação

Qual banco de dados você está usando?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sex Dez 21, 2012 9:09 pm    Assunto: Responder com Citação

Utilize o trio adoconnection mais adodataset, datasetprovider, clientdaset, assim os dados somente serão gravados no banco com um applyupdates().
O único problema é com mestre/detalhes utilizando-se datasetfields devido ao campo de autoincremento, como não é gerado antes e não achei uma maneira de fazer isto, dá erro.

Contornei isto com gambiarra no access, visto que este campo autoincremento somente é aplicado quando é gravado ficamente no banco, mas em mestre/detalhe vc precisa dele antes para passar aos filhos, neste tipo de relacionamento com datasetfield.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
28440959842
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 166

MensagemEnviada: Sex Dez 21, 2012 10:23 pm    Assunto: Responder com Citação

Batera... estou usando Oracle!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Oseiasao
Membro Junior
Membro Junior


Registrado: Sexta-Feira, 14 de Outubro de 2011
Mensagens: 303

MensagemEnviada: Sex Dez 21, 2012 10:25 pm    Assunto: Responder com Citação

ola amigo, eu fiz algo parecido com um StringGrid, a diferença é que eu estou coletando os dados vindo de lugares diferentes, no seu caso, vc precisa que seja inserido nele, dependendo de qts campos são, voce pode colocar uma qtd de edit's no seu form e um botão para inserir, alguns dados voce pode inserir por codigo, e para o caso do usuario precisar alterar, voce insere outros edits, não sei se te atende, no meu caso eram poucos campos, mas imagina se é uma tela de cadastro, não e mt viável voce inserir 30 edit.

Vou postar abaixo os códigos que eu usei ...

******** BOTÃO INSERIR *************

Código:

procedure TFrmCadPresCont.BtnInsClick(Sender: TObject);
Var
  Soma: Integer;
begin
Soma := 1;

{******************************************************************************
*******************************************************************************
    SE PRESSIONAR O BOTÃO INSERIR E NÃO TIVER NENHUMA IGREJA SELECIONADO,
              ENTÃO ORIENTA O MEMBRO A SELECIONAR A IGREJA
*******************************************************************************
******************************************************************************}
  if Length(Trim(JVDBLCong.Text)) = 0 then
    begin
      Application.MessageBox('Selecione a congregação', 'INFORMAÇÃO', 0);
      JVDBLCong.SetFocus;
      Abort;
    end;

{******************************************************************************
*******************************************************************************
    SE PRESSIONAR O BOTÃO INSERIR E NÃO TIVER NENHUM MEMBRO SELECIONADO,
              ENTÃO ORIENTA O USUÁRIO A SELECIONAR O MEMBRO
*******************************************************************************
******************************************************************************}
  if Length(Trim(JvDBLDiz.Text)) = 0 then
    begin
      if ChkDiz.Checked = False then
        begin
          Application.MessageBox('Selecione o membro', 'INFORMAÇÃO', 0);
          JvDBLDiz.SetFocus;
          Abort;
        end;
    end;

{******************************************************************************
*******************************************************************************
    SE TIVER SELECIONADO O MEMBRO E NÃO INSERIR O VALOR, ORIENTAR DIGITAR
                            O VALOR DO DIZIMO.
*******************************************************************************
******************************************************************************}
  if (JvDBLDiz.KeyValue > 0) and (EdtDizimista.AsFloat = 0) then
    begin
      Application.MessageBox('Digite o valor do dízimo', 'INFORMAÇÃO', 0);
      EdtDizimista.SetFocus;
      Abort;
    end;

    LnVer := 1;
{******************************************************************************
*******************************************************************************
                    VERIFICANDO SE O MEMBRO SELECIONADO JÁ
                        ESTÁ INSERIDO NA RELAÇÃO ATUAL
*******************************************************************************
******************************************************************************}
  if ChkDiz.Checked = False then
    begin
      while LnVer <L> 4 then
        begin
          if L > 0 then
            begin
              StrGrdDiz.RowCount    := StrGrdDiz.RowCount + 1;
              StrGrdDiz.Cells[C0,L] := IntToStr(L);
              StrGrdDiz.Cells[C1,L] := '0';
              StrGrdDiz.Cells[C2,L] := EdtDizViz.Text;
              StrGrdDiz.Cells[C3,L] := JVDBLCong.Text;
              StrGrdDiz.Cells[C4,L] := DateToStr(Now);
              StrGrdDiz.Cells[C5,L] := EdtDizimista.Text;
              StrGrdDiz.Cells[C6,L] := JVDBLCong.KeyValue;
            end;
        end
      Else
        begin
          Application.MessageBox('Insira o nome do Dizimista', 'VISITANTE', 0);
          EdtDizViz.SetFocus;
          Abort;
        end;
    end
  else
    begin
      if L > 0 then
        begin
          StrGrdDiz.RowCount    := StrGrdDiz.RowCount + 1;
          StrGrdDiz.Cells[C0,L] := IntToStr(L);
          StrGrdDiz.Cells[C1,L] := JvDBLDiz.KeyValue;
          StrGrdDiz.Cells[C2,L] := JvDBLDiz.Text;
          StrGrdDiz.Cells[C3,L] := JVDBLCong.Text;
          StrGrdDiz.Cells[C4,L] := DateToStr(Now);
          StrGrdDiz.Cells[C5,L] := EdtDizimista.Text;
          StrGrdDiz.Cells[C6,L] := JVDBLCong.KeyValue;
        end;
    end;
  L := L + 1;

{******************************************************************************
*******************************************************************************
                     SOMANDO TOTAL DE DIZIMOS DO STRINGGRID
*******************************************************************************
******************************************************************************}
  EdtVlDiz.AsCurrency := EdtDizimista.AsCurrency + EdtVlDiz.AsCurrency;

{******************************************************************************
*******************************************************************************
                LIMPANDO CAMPOS PARA INSERIR NOVOS DIZIMISTAS
*******************************************************************************
******************************************************************************}
    JvDBLDiz.KeyValue := -1;
    EdtDizimista.AsCurrency := 0;
end;





Código:

procedure TFrmCadPresCont.StrGrdDizSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
Var
  key: Word;
begin
{*******************************************************************************
********************************************************************************
                            PEGANDO A LINHA SELECIONADA
********************************************************************************
*******************************************************************************}
  try
    StrToint(StrGrdDiz.Cells[0,ARow]);
  except
    on Esc:Exception do
      Begin
        ShowMessage('Linha inválida');
        Abort;
      End;
  end;
  LnSel := StrToInt(StrGrdDiz.Cells[0,ARow]);

end;


*********************deletando linha ***********************

Código:

procedure TFrmCadPresCont.StrGrdDizKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
Var
  ACol, ARow    :Integer;
  Cont, NLinha  :Integer;
  LnDel         :Integer;
begin
LnDel := 1;

{*******************************************************************************
********************************************************************************
                        DELETAR DADOS DA LINHA SELECIONADA
                     SE A LINHA SELECIONADA JA ESTIVER VAZIA,
                      ENTÃO INFORMA QUE E UMA LINHA INVÁLIDA
********************************************************************************
*******************************************************************************}
  if (Key = vk_delete) and (LnSel > L) then
    begin
      ShowMessage('A linha selecionada não e válida');
      Abort;
    end;

{*******************************************************************************
********************************************************************************
                  VERIFICANDO SE A TECLA DELETE FOI PRESSIONADA
                          AO SELECIONAR UM DIZIMISTA
********************************************************************************
*******************************************************************************}
  if Key = VK_DELETE then
    begin

{*******************************************************************************
********************************************************************************
              VERIFICANDO SE A LINHA SELECIONADA É A ULTIMA DO GRID
********************************************************************************
*******************************************************************************}
      if LnSel = L then
        begin
          Application.MessageBox('A linha selecionada não contém membro',
            'Informação', 0);
          Abort;
        end;

{*******************************************************************************
********************************************************************************
                   DIMINUINDO O DIZIMO DA LINHA SELECIONADA
                     NO CAMPO DO VALOR TOTAL DOS DIZIMOS
********************************************************************************
*******************************************************************************}
  EdtValor.Text := StrGrdDiz.Cells[C5,LnSel]; // PASSANDO VALOR PARA CALCULO
  EdtVlDiz.AsCurrency := EdtVlDiz.AsCurrency - EdtValor.AsCurrency;

{*******************************************************************************
********************************************************************************
                          LIMPANDO A LINHA SELECIONADA
********************************************************************************
*******************************************************************************}
      StrGrdDiz.Cells[C0,LnSel] := '';
      StrGrdDiz.Cells[C1,LnSel] := '';
      StrGrdDiz.Cells[C2,LnSel] := '';
      StrGrdDiz.Cells[C3,LnSel] := '';
      StrGrdDiz.Cells[C4,LnSel] := '';
      StrGrdDiz.Cells[C5,LnSel] := '';

{*******************************************************************************
********************************************************************************
                 SUBINDO UMA LINHA, TODOS OS DADOS DAS LINHAS
                           ABAIXO DA QUE FOI LIMPA
********************************************************************************
*******************************************************************************}
        while LnDel < (StrGrdDiz.RowCount - 1) do
          begin
            if StrGrdDiz.Cells[0,LnSel+1] <> '' then
              StrGrdDiz.Cells[C0,LnSel] := IntToStr(StrToInt(StrGrdDiz.Cells[0,LnSel+1])-1);
            if StrGrdDiz.Cells[0,LnSel+1] = '' then
              StrGrdDiz.Cells[C0,LnSel] := StrGrdDiz.Cells[0,LnSel+1];
            StrGrdDiz.Cells[C1,LnSel] := StrGrdDiz.Cells[1,LnSel+1];
            StrGrdDiz.Cells[C2,LnSel] := StrGrdDiz.Cells[2,LnSel+1];
            StrGrdDiz.Cells[C3,LnSel] := StrGrdDiz.Cells[3,LnSel+1];
            StrGrdDiz.Cells[C4,LnSel] := StrGrdDiz.Cells[4,LnSel+1];
            StrGrdDiz.Cells[C5,LnSel] := StrGrdDiz.Cells[5,LnSel+1];
            LnDel := LnDel + 1;
            LnSel := LnSel + 1;
          end;

{*******************************************************************************
********************************************************************************
                    DELETANDO A ULTIMA LINHA QUE FICOU VAZIA
********************************************************************************
*******************************************************************************}
         StrGrdDiz.RowCount := StrGrdDiz.RowCount - 1;
         L := L - 1;
    end;

end;

_________________
Melhor é o fim das coisas do que o principio delas .... (Salomão)
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Batera
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Julho de 2008
Mensagens: 4899
Localização: Maringá

MensagemEnviada: Sex Dez 21, 2012 10:28 pm    Assunto: Responder com Citação

E se você utilizar o trio sugerido pelo johnny-walker?
AdoDataset + DatasetProvider + Clientdaset

Mesmo assim cara, eu acho que é a configuração de alguma propriedade. Isso normalmente não acontece. Conforme o johnny-walker disse, é preciso executar um ApplyUpdates para que os dados sejam persistidos no banco.
Não tem nenhum código no evento OnAfterPost ou AfterInsert da Query?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB