Fórum Toda a manipulação de dados feita do banco de dados #39788
30/10/2003
0
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
Curtir tópico
+ 0Posts
30/10/2003
Maicon Loffi
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
Gostei + 0
30/10/2003
Chas
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?
Gostei + 0
30/10/2003
Maicon Loffi
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;
Gostei + 0
30/10/2003
Chas
Isso que eu queria, vai me ajudar bastante!!!
um abraço,
Carlos Henrique
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)