Fórum Toda a manipulação de dados feita do banco de dados #39788

30/10/2003

0

Pessoal,


Desenvolvo aplicações usando Delphi com banco de dados Interbase. Em minhas aplicações todas as consultas, alterações, inserções e excluções são feita no delphi usando querys. Minha dúvida é o seguinte: [u:42aa2ae0ac]gostaria de saber se é possível eu criar stored procedures que faça todas essas manipulações de dados citadas[/u:42aa2ae0ac]. Ex: Criar uma stored procedure para inserir um cadastro de cliente, é claro que ele vai buscar as informações na tela de cadastro, neste caso seria no Delphi, e outras transações usando stored procedure, como pesquisa, alterações, exclusões e etc.... Acredito que desta forma, meus sistemas ficariam mais leves.
Alguém sabe me dizer se é possível? se é viavel? e poderia me dar alguns exemplos?

Carlos Henrique


Chas

Chas

Responder

Posts

30/10/2003

Maicon Loffi

Alguém sabe me dizer se é possível?
certamente é possível.

se é viavel?
Acho que não compensaria (vai te dar mais mão de obra, porque tens que informar tudo por parâmetro) enquanto que com SQL você faz tudo automatico.

e poderia me dar alguns exemplos?
Tenho uns 15 sistemas, Só uso procedure em um, onde o freteiro possui N produtores (selecionados) que serão lançados mensalmente em uma outra tabela para lançamento de leite.

Esse processo é bem mais rápido do que quando eu fazia através do sistema, passando registro por registro (Na Query) para lançamento.
Não tenho dúvida que um processo interno é mais rápido, mas depende de como e a quantidade de verificações que o processo faz.

o exemplo está abaixo.

ALTER PROCEDURE LANCAR_FRETEIRO_PRODUTORES (
FRETEIRO_CODIGO INTEGER,
ANO SMALLINT,
MES SMALLINT,
PRODUTOR_CODIGO INTEGER)
AS
DECLARE VARIABLE FRETEIRO INTEGER;
DECLARE VARIABLE PRODUTOR INTEGER;
DECLARE VARIABLE G INTEGER;
DECLARE VARIABLE OI INTEGER;
DECLARE VARIABLE OP INTEGER;
DECLARE VARIABLE CIDADE INTEGER;
begin
SELECT FRETEIRO_CODIGO FROM FRETEIROS_LEITE
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
ANO =:ANO AND MES =:MES INTO :FRETEIRO;

IF (FRETEIRO IS NULL) THEN /* FRETEIRO */
INSERT INTO FRETEIROS_LEITE
(FRETEIRO_CODIGO,ANO,MES,RS_CHEQUE_MINIMO)
VALUES
(:FRETEIRO_CODIGO,:ANO,:MES,30);

IF (PRODUTOR_CODIGO IS NULL) THEN /* PRODUTORES DO FRETEIRO */
FOR SELECT CODIGO, GRUPO, ORDEM_IMPAR, ORDEM_PAR, CIDADE_CODIGO FROM PRODUTORES
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
CODIGO NOT IN (SELECT PRODUTOR_CODIGO FROM PRODUTORES_LEITE
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
ANO =:ANO AND MES =:MES) INTO :PRODUTOR,:G,:OI,:OP,:CIDADE
DO
INSERT INTO PRODUTORES_LEITE
(FRETEIRO_CODIGO,ANO,MES,PRODUTOR_CODIGO,GRUPO,ORDEM_PAR,ORDEM_IMPAR,CIDADE_CODIGO)
VALUES
(:FRETEIRO_CODIGO,:ANO,:MES,:PRODUTOR,:G,:OI,:OP,:CIDADE);
ELSE /* PRODUTOR INDIVIDUAL */
BEGIN
SELECT CODIGO, GRUPO, ORDEM_IMPAR, ORDEM_PAR, CIDADE_CODIGO FROM PRODUTORES
WHERE CODIGO =:PRODUTOR_CODIGO AND
CODIGO NOT IN (SELECT PRODUTOR_CODIGO FROM PRODUTORES_LEITE
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
PRODUTOR_CODIGO =:PRODUTOR_CODIGO AND
ANO =:ANO AND MES =:MES) INTO :PRODUTOR,:G,:OI,:OP,:CIDADE;
IF (:PRODUTOR IS NOT NULL) THEN
INSERT INTO PRODUTORES_LEITE
(FRETEIRO_CODIGO,ANO,MES,PRODUTOR_CODIGO,GRUPO,ORDEM_PAR,ORDEM_IMPAR,CIDADE_CODIGO)
VALUES
(:FRETEIRO_CODIGO,:ANO,:MES,:PRODUTOR,:G,:OI,:OP,:CIDADE);
END
suspend;
end


Responder

Gostei + 0

30/10/2003

Chas

[quote:a58c709c23=´Maicon César Loffi´]Alguém sabe me dizer se é possível?
certamente é possível.

se é viavel?
Acho que não compensaria (vai te dar mais mão de obra, porque tens que informar tudo por parâmetro) enquanto que com SQL você faz tudo automatico.

e poderia me dar alguns exemplos?
Tenho uns 15 sistemas, Só uso procedure em um, onde o freteiro possui N produtores (selecionados) que serão lançados mensalmente em uma outra tabela para lançamento de leite.

Esse processo é bem mais rápido do que quando eu fazia através do sistema, passando registro por registro (Na Query) para lançamento.
Não tenho dúvida que um processo interno é mais rápido, mas depende de como e a quantidade de verificações que o processo faz.

o exemplo está abaixo.

ALTER PROCEDURE LANCAR_FRETEIRO_PRODUTORES (
FRETEIRO_CODIGO INTEGER,
ANO SMALLINT,
MES SMALLINT,
PRODUTOR_CODIGO INTEGER)
AS
DECLARE VARIABLE FRETEIRO INTEGER;
DECLARE VARIABLE PRODUTOR INTEGER;
DECLARE VARIABLE G INTEGER;
DECLARE VARIABLE OI INTEGER;
DECLARE VARIABLE OP INTEGER;
DECLARE VARIABLE CIDADE INTEGER;
begin
SELECT FRETEIRO_CODIGO FROM FRETEIROS_LEITE
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
ANO =:ANO AND MES =:MES INTO :FRETEIRO;

IF (FRETEIRO IS NULL) THEN /* FRETEIRO */
INSERT INTO FRETEIROS_LEITE
(FRETEIRO_CODIGO,ANO,MES,RS_CHEQUE_MINIMO)
VALUES
(:FRETEIRO_CODIGO,:ANO,:MES,30);

IF (PRODUTOR_CODIGO IS NULL) THEN /* PRODUTORES DO FRETEIRO */
FOR SELECT CODIGO, GRUPO, ORDEM_IMPAR, ORDEM_PAR, CIDADE_CODIGO FROM PRODUTORES
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
CODIGO NOT IN (SELECT PRODUTOR_CODIGO FROM PRODUTORES_LEITE
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
ANO =:ANO AND MES =:MES) INTO :PRODUTOR,:G,:OI,:OP,:CIDADE
DO
INSERT INTO PRODUTORES_LEITE
(FRETEIRO_CODIGO,ANO,MES,PRODUTOR_CODIGO,GRUPO,ORDEM_PAR,ORDEM_IMPAR,CIDADE_CODIGO)
VALUES
(:FRETEIRO_CODIGO,:ANO,:MES,:PRODUTOR,:G,:OI,:OP,:CIDADE);
ELSE /* PRODUTOR INDIVIDUAL */
BEGIN
SELECT CODIGO, GRUPO, ORDEM_IMPAR, ORDEM_PAR, CIDADE_CODIGO FROM PRODUTORES
WHERE CODIGO =:PRODUTOR_CODIGO AND
CODIGO NOT IN (SELECT PRODUTOR_CODIGO FROM PRODUTORES_LEITE
WHERE FRETEIRO_CODIGO =:FRETEIRO_CODIGO AND
PRODUTOR_CODIGO =:PRODUTOR_CODIGO AND
ANO =:ANO AND MES =:MES) INTO :PRODUTOR,:G,:OI,:OP,:CIDADE;
IF (:PRODUTOR IS NOT NULL) THEN
INSERT INTO PRODUTORES_LEITE
(FRETEIRO_CODIGO,ANO,MES,PRODUTOR_CODIGO,GRUPO,ORDEM_PAR,ORDEM_IMPAR,CIDADE_CODIGO)
VALUES
(:FRETEIRO_CODIGO,:ANO,:MES,:PRODUTOR,:G,:OI,:OP,:CIDADE);
END
suspend;
end[/quote:a58c709c23]

Blz, e no delphi? como fez para que as procedures pegasse as informações do campo?


Responder

Gostei + 0

30/10/2003

Maicon Loffi

Blz, e no delphi? como fez para que as procedures pegasse as informações do campo?

Coloquei o componente IBStoredProc1
e na propriedade StoredProcName Identifiquei o nome da procedure.

Ativei os Parametros de entrada.

Abaixo segue o exemplo onde chamo a procedure através do delphi

If FP.M_Confirme(´Você Deseja Confirmar o Lançamento?´) Then
begin
Form_Data.DATA.Date := Now;
Form_Data.ShowModal;
If Form_Data.Tag = 0 Then
begin
IBSP_LANCAR.Params[0].Value := QFCODIGO.Value;
IBSP_LANCAR.Params[1].Value := Copy( DateToStr(Form_Data.DATA.Date),7,4 ); // ANO
IBSP_LANCAR.Params[2].Value := Copy( DateToStr(Form_Data.DATA.Date),4,2 ); // MES
If TMenuItem(Sender).Name[5] = ´1´ Then
IBSP_LANCAR.Params[3].Clear // PRODUTOR
else
IBSP_LANCAR.Params[3].Value := QPCODIGO.Value; // PRODUTOR
IBSP_LANCAR.ExecProc;
IBSP_LANCAR.Transaction.CommitRetaining;
end;
end;


Responder

Gostei + 0

30/10/2003

Chas

Valeu colega,

Isso que eu queria, vai me ajudar bastante!!!

um abraço,

Carlos Henrique


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar