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

(Resolvido) Ajuda com Stored Procedure


Pompeu

Pergunta

Saudações ...

Estou desenvolvendo um sistema em Delphi e MySQL, preciso gerar um faturamento e tenho certeza q através de uma SP é bem mais rápido, mas não estou conseguindo.

sei q este forum é sobre MySQL mas segue rotina feita em delphi:

DTM.TBSocios.First;
          while not DTM.TBSocios.Eof do
            begin
              //Gerar Valor Mensalidade
              V_TipoSocio := DTM.TBSocios.FieldByName('tiposocio').AsString;
              V_NTitulo := DTM.TBSocios.FieldByName('ntitulo').AsString;
              V_Codigo := DTM.TBSocios.FieldByName('codigo').AsString;

              DTM.TBTaxas.Locate('id', DTM.TBSocios.FieldByName('TaxaID').AsString, []);

              DTM.TBTaxasLancamentos.Active := True;
              DTM.TBTaxasLancamentos.Filter := 'idsocio=' + DTM.TBSocios.FieldByName('id').AsString;
              DTM.TBTaxasLancamentos.Filtered := True;
              VValorTaxas := 0;
              DTM.TBTaxasLancamentos.First;
              while not DTM.TBTaxasLancamentos.Eof do
                begin
                  VValorTaxas := VValorTaxas + DTM.TBTaxasLancamentos.FieldByName('valor').AsFloat;
                  DTM.TBTaxasLancamentos.Next;
                end;
              DTM.TBTaxasLancamentos.Active := False;

              VValorMensalidade := DTM.TBTaxas.FieldByName('valor').AsFloat + VValorTaxas;

              CRNovoRegistro;

              DTM.TBContas.Close;
              DTM.TBContas.SQL.Clear;
              DTM.TBContas.SQL.Add('Insert Into contasreceber (id, codigo, ' +
                                  'nome, ' +
                                  'ndoc, ' +
                                  'valor, ' +
                                  'lancamento, ' +
                                  'vencimento, ' +
                                  'planocontas, ' +
                                  'idfaturamento' +
                                  ') Values (' + chr(39)
                                  + IntToStr(CRID) + chr(39) + ', ' + chr(39)
                                  + ContasReceber.V_IDCodigo + chr(39) + ', ' + chr(39)
                                  + DTM.TBSocios.FieldByName('nome').AsString + chr(39) + ', ' + chr(39)
                                  + NDocumento.Text + chr(39) + ', ' + chr(39)
                                  + FloatToStr(VValorMensalidade) + chr(39) + ', ' + chr(39)
                                  + DateToStr(Date) + chr(39) + ', ' + chr(39)
                                  + Vencimento.Text + chr(39) + ', ' + chr(39)
                                  + PlanoConta.Text + chr(39) + ', ' + chr(39)
                                  + IntToStr(ID) + chr(39) + ')');
              DTM.TBContas.ExecSQL;

              DTM.TBContas.Close;
              DTM.TBContas.SQL.Clear;
              DTM.TBContas.SQL.Add('commit');
              DTM.TBContas.ExecSQL;
              //FIM Gerar Valor Mensalidade

              DTM.TBSocios.Next;
            end;

A rotina em delphi está funcionando perfeitamente, gostaria de fazer uma SP.

O Problema está sendo em localizar o registro em outra tabela ... não sei fazer isso em SP

Obrigado

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'Pompeu'

A rotina em delphi está funcionando perfeitamente, gostaria de fazer uma SP.

O Problema está sendo em localizar o registro em outra tabela ... não sei fazer isso em SP

Para trabalhar lendo linhas de tabelas você deverá usar CURSORes. Recentemente foram publicados alguns tópicos sobre storage procedures usando cursor.

Cursor nada mais é que o nome interno que a tabela vai usar durante o ciclo da SP(storage procedure).

Para ler cada linha usa-se o comando FETCH. Para controlar o final do arquivo usa-se uma variável inteira. Esta variável deve ser atribuida a um HANDLER.

Veja o exemplo abaixo:

DELIMITER $$;

DROP PROCEDURE IF EXISTS `base_teste_drc`.`CalculaSaldo`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `CalculaSaldo`(in vColaboradorID INT)
BEGIN
  DECLARE vDone INT DEFAULT 0; /* declarada a variavel que servirá de marcador de EOF*/
  DECLARE vPontoID INT;
  DECLARE vCargaHoraria INT;
  DECLARE vTrabalho INT;
  DECLARE vSaldoAux INT;
  DECLARE vDataAtual DateTime;
  DECLARE vStatus INT default 0;
-- Busca todas as datas que devem ser atualizadas (ultimos 30 dias)
  DECLARE Curs CURSOR FOR /* declaração do cursor*/
         SELECT str_to_date(date_format(Entrada,'%Y-%m-%d  00:00:00'), get_format(Datetime, 'iso')),
         SUM(Trabalho)
         FROM Ponto
         WHERE
         ColaboradorID = vColaboradorID AND
         DATEDIFF(now(), Entrada) <= 180 AND
         DATEDIFF(now(), Entrada) >= 1
         GROUP BY str_to_date(date_format(Entrada,'%Y-%m-%d  00:00:00'), get_format(Datetime, 'iso'))
         ORDER BY 1;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = 1; /* declaração do handler que controlará o EOF */
-- Busca a carga hor?ria do colaborador
    SELECT @vCargaHoraria := CargaHoraria*60 FROM Colaborador WHERE ColaboradorID = vColaboradorID;
    OPEN Curs; /* abre o cursor */
  REPEAT
      FETCH Curs INTO vDataAtual, vTrabalho; /* lê linha do select contido no cursor */
      IF NOT vDone THEN /* Verifica se ocorreu o EOF */
        SELECT @vSaldoAUx := IFNULL((SELECT  saldo
                         FROM     Ponto
                         WHERE    ColaboradorID = vColaboradorID
                                  AND Str_to_date(Date_format(Entrada,'%Y-%m-%d  00:00:00'), Get_format(DATETIME,'iso')) < Str_to_date(Date_format(vDataAtual,'%Y-%m-%d  00:00:00'),Get_format(DATETIME,'iso'))
                         ORDER BY Entrada DESC
                         LIMIT    1),0) + vTrabalho - (CASE
                                                        WHEN Weekday(vDataAtual) IN (5,6)
                                                        THEN 0
                                                        ELSE vCargaHoraria
                                                      END);
        UPDATE Ponto
        SET    Saldo = @vSaldoAux
        WHERE  ColaboradorID = vColaboradorID
               AND Str_to_date(Date_format(Entrada,'%Y-%m-%d  00:00:00'),
                               Get_format(DATETIME,'iso')) = Str_to_date(Date_format(vDataAtual,'%Y-%m-%d  00:00:00'),Get_format(DATETIME,'iso'));
      END IF;
  UNTIL vDone END REPEAT;
    CLOSE Curs; /* Fecha o cursor */
END$$

DELIMITER;$$

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Denis ...

Estou tentando fazer e assim q conseguir ou eu tiver alguma duvida eu posto aki ok

você poderia me dar uma explicação sobre como armazenar informações nas ariaveis da SP ? pode ser em qualquer linguagem de programação, não precisa ser exatamente em delphi só pra eu ter uma ideia.

mais uma vez Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0
Obrigado Denis ...

Estou tentando fazer e assim q conseguir ou eu tiver alguma duvida eu posto aki ok

você poderia me dar uma explicação sobre como armazenar informações nas ariaveis da SP ? pode ser em qualquer linguagem de programação, não precisa ser exatamente em delphi só pra eu ter uma ideia.

mais uma vez Obrigado

Se você falou de atribuição, o comando em SQL é este:

SET    Saldo = @vSaldoAux

Se você quer passar parâmetros de sua linguagem de peogramação para a SP, vai depender do componente que você estiver usando. No seu caso ZEOS ou BDE via ODBC.

Quanto ao exemplo acima Saldo é um campo da tabela e @vSaldoAux é uma variável não declarada. Particularmente, eu prefiro declarar a variável e usá-la sem o "@".

Se não for nada disso que passei acima, por favor explique melhor o que você quer.

P.S. Entendo bem de Delphi. Só não tenho tempo para coneverter seu código para SQL.

Link para o comentário
Compartilhar em outros sites

  • 0

"Denis" eu uso delphi 7 e o coponente Zeos ... eu gostaria de saber como enviar valores para a variavel dentro da SP

Ex: tenho uma SP e duas variaveis declaradas certo, como eu envio valores para essas variaveis. Eu chamo a SP atraves do delphi usando o comando "call" conforme exemplo abaixo:

DTM.TBNomeDaTabela.Close;

DTM.TBNomeDaTabela.SQL.Clear;

DTM.TBNomeDaTabela.SQL.Add('CALL nome_da_sp()');

DTM.TBNomeDaTabela.ExecSQL;

só q eu não queria chamar somente a SP, eu gotaria de chama-la passando os valores das variaveis entendeu ?

Muito obrigado mais uma vez "Denis"

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'Pompeu'

Você já tentou assim?

DTM.TBNomeDaTabela.Close;
  DTM.TBNomeDaTabela.SQL.Clear;
  DTM.TBNomeDaTabela.SQL.Add('CALL nome_da_sp(:param1)');
  DTM.TBNomeDaTabela.parambyname('param1').value := sua_variavel; 
  DTM.TBNomeDaTabela.ExecSQL;

É desta forma que passo parametros para todas as minhas instruções SQL dentro do delphi.

Também uso o Delphi 7.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...