[firebird] Procedura, numeracja pozycji na dok.
Art.R - 18-02-2007 00:04
[firebird] Procedura, numeracja pozycji na dok.
Witam, próbuję napisać procedurę, która po skasowaniu pewniej pozycji, na jakimś dokumencie sprzedaży, ponumerowała by od nowa te pozycje. Brakuje mi kawałka kodu, przypuszczam że tu chodzi o kursor ale jakoś nie mogę z tym ruszyć:
CREATE PROCEDURE DELETE_ZAMOWIENIAPOZ ( ID INTEGER, ID_ZAMOWIENIA INTEGER) AS
DECLARE VARIABLE I INTEGER; DECLARE VARIABLE II INTEGER; begin
DELETE FROM ZAMOWIENIAPOZ where ID_ZAMOWIENIAPOZ=:ID;
ii=0; FOR SELECT LP_FA FROM ZAMOWIENIAPOZ WHERE ID_ZAMOWIENIA=:ID_ZAMOWIENIA into I DO begin ii=ii+1; /*UPDATE ZAMOWIENIAPOZ SET LP_FA=:ii WHERE ID_ZAMOWIENIA=:ID_ZAMOWIENIA;*/ end
suspend; end
pozdrawiam Art.R
---------------------------------------------------------------------- Oficjalne konto pocztowe europejskich internautow! >>> http://link.interia.pl/f19e8
-- Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
lausiv@poczta.fm - 21-02-2007 00:05
On 17 Lut, 10:51, Art....@poczta.fm (Art.R) wrote: > Witam, > próbuję napisać procedurę, która po skasowaniu > pewniej pozycji, na jakimś dokumencie sprzedaży, > ponumerowała by od nowa te pozycje. Brakuje mi > kawałka kodu, przypuszczam że tu chodzi o kursor > ale jakoś nie mogę z tym ruszyć: > > CREATE PROCEDURE DELETE_ZAMOWIENIAPOZ ( > ID INTEGER, > ID_ZAMOWIENIA INTEGER) > AS > > DECLARE VARIABLE I INTEGER; > DECLARE VARIABLE II INTEGER; > begin > > DELETE FROM ZAMOWIENIAPOZ > where ID_ZAMOWIENIAPOZ=:ID; > > ii=0; > FOR SELECT LP_FA > FROM ZAMOWIENIAPOZ > WHERE ID_ZAMOWIENIA=:ID_ZAMOWIENIA into I > DO > begin > ii=ii+1; > /*UPDATE ZAMOWIENIAPOZ SET LP_FA=:ii > WHERE ID_ZAMOWIENIA=:ID_ZAMOWIENIA;*/ > end > > suspend; > end > > pozdrawiam Art.R > > ---------------------------------------------------------------------- > Oficjalne konto pocztowe europejskich internautow! > > >>>http://link.interia.pl/f19e8 > > -- > Archiwum grupy:http://niusy.onet.pl/pl.comp.bazy-danych
Kursorów radze unikać, ze względu na wydajność, a swoją drogąmoże lepiej zrobić to tak (co prawda nie wiem w jakim SQL - moja propozycja dla TSQL). A tak przy okazji to proponuje stosowac jakiekolwiek ale zeby byly konwencje nazewnictwa i programowania - bedzie czytelniej ;):
CREATE PROCEDURE Test_sp_DeleteZamowieniaPoz ( @Id Int, @IdZamowienia int) AS BEGIN DECLARE @UsuwanyNumer int
SELECT @UsuwanyNumer = Lp_Fa FROM ZamowieniaPoz WHERE Id_ZamowieniaPoz = @Id
DELETE FROM ZamowieniaPoz WHERE Id_ZamowieniaPoz=@Id
UPDATE ZamowieniaPoz SET Lp_Fa = Lp_Fa -1 WHERE Lp_Fa > @UsuwanyNumer AND Id_Zamowienia = @IdZamowienia
END
Przy założeniu oczywiści że numeracja pozycji jest w polu Lp_Fa ;)
Pozdrawiam
Art.R - 22-02-2007 00:01
> Kursorów radze unikać, ze względu na wydajność, a swoją drogą może > lepiej zrobić to tak (co prawda nie wiem w jakim SQL - moja propozycja > dla TSQL). A tak przy okazji to proponuje stosowac jakiekolwiek ale > zeby byly konwencje nazewnictwa i programowania - bedzie > czytelniej ;): > > CREATE PROCEDURE Test_sp_DeleteZamowieniaPoz ( > @Id Int, > @IdZamowienia int) > AS > BEGIN > DECLARE @UsuwanyNumer int > > SELECT @UsuwanyNumer = Lp_Fa > FROM ZamowieniaPoz > WHERE Id_ZamowieniaPoz = @Id > > DELETE > FROM ZamowieniaPoz > WHERE Id_ZamowieniaPoz=@Id > > UPDATE ZamowieniaPoz > SET Lp_Fa = Lp_Fa -1 > WHERE Lp_Fa > @UsuwanyNumer > AND Id_Zamowienia = @IdZamowienia > > END > > Przy założeniu oczywiści że numeracja pozycji jest w polu Lp_Fa ;) > w firebird wyglądało by to prawie tak samo:
DECLARE VARIABLE I INTEGER; begin
SELECT LP_FA FROM ZAMOWIENIAPOZ WHERE ID_ZAMOWIENIAPOZ=:ID into :I;
DELETE FROM ZAMOWIENIAPOZ where ID_ZAMOWIENIAPOZ=:id;
UPDATE ZAMOWIENIAPOZ SET LP_FA = LP_FA-1 WHERE ID_ZAMOWIENIA=:ID_ZAMOWIENIA AND LP_FA > :I; end
ja dałem select po delete, wychodziły mi bzdury więc zacząłem kombinować...
---------------------------------------------------------------------- Tez tak potrafisz? - zobacz >> http://link.interia.pl/f19ec
-- Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Firebird - zmiana NULL na NOT NULL
[firebird] Czym =?ISO-8859-2?Q?zast=B1pi=E6_postgresowy_inte?==?ISO-8859-2?Q?rval_=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
MSSQL 2005 i uruchamianie procedury o =?ISO-8859-2?Q?okre=B6lone?==?ISO-8859-2?Q?j_godzinie?=
Insert do tabeli danymi z innej tabeli Firebird
Insert do tabeli z danych innej tabeli plus dodatkowa wartośćpola (Firebird)
[MS SQL 2000/2005] Procedura z dynamicznym SQL
firebird - dostep do roznych baz na podstawie nazwy usera,hasla i adresu IP
=?iso-8859-2?q?Konfiguracja_Firebirda_pod_k=B1tem_wykorzystan ia_pami=EAci?=
=?ISO-8859-2?Q?[firebird]_gdzie_si=EA_podzia=B3y_polskie_literki?=
zanotowane.pldoc.pisz.plpdf.pisz.plfantazia.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|