[ farkZ @ 05.04.2012. 00:57 ] @
Imam formu sa padajućim menijima i boxom gdje korisnik upisuje količinu. Nakon potvrde ti podaci se zapišu u bazu. To radi!

$ds->InsertCommand = "insert into tret_gnoj (ID_tg, ID_preparat, korisnik_id, cestica, kultura, datum_tretiranja, naziv_prep, kolicina_prep)
values (@ID_tg, '@ID_preparat', '@korisnik_id', '@cestica', '@kultura', '@datum_tretiranja', '@naziv_prep', '@kolicina_prep')";

, istovremeno količina koju je korisnik unio u box (@kolicina_prep) bi se trebala oduzeti od trenutne količine na lageru u tablici preparat.

Ovo bi bila ideja...NE RADI!
$ds->UpdateCommand = "update preparat.kolicina = preparat.kolicina - @kolicina_prep
where
preparat.naziv_prep = tret_gnoj.naziv_prep";

Ne znam kako da dohvatim @kolicina_prep, kad pokušam uvesti neku varijablu u upit koju bi poslije mogao iskoristiti u update-u NE RADI!
Postoji li način da se i insert i update odvije u $ds->InsertCommand = "insert..................update................."



hvala
lp
Igor
[ bantu @ 05.04.2012. 08:05 ] @
Riješi to sa triggerom

http://dev.mysql.com/doc/refman/5.6/en/create-trigger.html

Code:

CREATE TRIGGER update_stanje AFTER INSERT ON tret_gnoj
  FOR EACH ROW BEGIN
    UPDATE tabela_stanje SET stanje = stanje - NEW.kolicina_prep WHERE id = NEW.ID_preparat;
  END;


[Ovu poruku je menjao bantu dana 05.04.2012. u 09:17 GMT+1]
[ farkZ @ 05.04.2012. 19:53 ] @

Hvala na brzom odgovoru, nažalost ne radi, ovo sam iskopao kao komentar za jako sličan primjer:

that is still multiple queries/sql statements to php and that is not supported by mysql_query
[ bogdan.kecman @ 05.04.2012. 23:52 ] @
kakve veze ima ponudjeno resenje sa trigerom i to sto php ne podrzava vise sql statement-a odjednom?!
[ bantu @ 06.04.2012. 07:37 ] @
Da, Bogdan potpuno je u pravu, ovo riješenje radi 1/1 i nema nikakve veze sa onim što si ti napisao. Jedino malo pogledaj da ga uskladiš sa svojim nazivima tabela i kolona, možda si tu imao problem.

Pored toga mislim da ne shvataš koncepciju triggera, zato sam ti i ostavio link.
Kad uspješno kreiraš trigger, u tvom slučaju, poslije svakog tvog inserta ažuriraće se stanje u tabela_stanje na način da će se od ternutnog stanja oduzimati kolicina_prep.
[ farkZ @ 09.04.2012. 18:56 ] @
nakon mnogo pokušaja na kraju je problem ovaj:
#1142 - TRIGGER command denied to user 'farkz'@'dhost.info' for table 'tret_gnoj'.
Poslao sam adminu mail, ali kako imam free hosting mislim da privilegije imaju samo paid useri.
još jednom hvala na korisnim linkovima i savjetima.

[ bogdan.kecman @ 09.04.2012. 19:04 ] @
onda spremis nekoliko sql upita pa executnes jedan po jedan
[ farkZ @ 21.04.2012. 12:49 ] @
Citat:
bogdan.kecman: onda spremis nekoliko sql upita pa executnes jedan po jedan


bogdane pun pogodak!
to sam i napravio i radi, evo koda:
$sql_update1='UPDATE zaliha SET zaliha.kolicina = kolicina - "'.$_POST['kolicina_prep'].'" WHERE zaliha.naziv_prep = "'.$_POST['naziv_prep'].'"';

Taj kod sam inače imao u v1.0 moje male webaplikacije i naravno radio je kako i treba, odnedavno sam počeo sve raditi u Koolgridu jer mi izuzetno odgovara pa sam počeo imati probleme sa "custom kodom", izbacivao mi je hrpe errora. U bit sam sad samo iskopirao taj stari kod i proradilo je. Osječam se užasno glupo jer sam kod u biti imao cijelo vrijeme doslovno pred nosom, a istovremeno sretno jer je rješenje toliko jednostavno (tjednima sam isprobavao svakave kombinacije, zadnje je bio ovaj trigger...)

hvala još jednom na savjetima i komentarima
lp
Igor
[ farkZ @ 12.05.2012. 19:40 ] @
Radim upgrade prošlog triggera pa sam opet zapeo.
Situacija:Kad korisnik unese neku količinu gnojiva (tbl gnojidba) ta količina se zapiše i ujedno se skine sa lagera (tbl zalihaG). To radim sa triggerom koji radi :).
Htio bih da prilikom unosa količine u (tbl gnojidba) triger provjeri stanje (tbl zalihaG) i ako je količina koju je unio korisnik u (tbl gnojidba) veća od količine na stanju (tbl zalihaG) trebalo bi se pojaviti upozorenje da je količina na zalihi premala.
Pokušao sam sa raznim kombinacijama, zadnja u nizu je ova:
Code:

SQL
CREATE TRIGGER update_zalihaG
AFTER INSERT
ON gnojidba
FOR EACH ROW BEGIN
DECLARE trenutno int(11);
SELECT kolicina
INTO trenutno
FROM zalihaG
WHERE naziv_gnoj = NEW.naziv_gnoj;
IF (trenutno >= NEW.kolicina_gnojiva)
THEN
UPDATE zalihaG
SET kolicina = (kolicina-NEW.kolicina_gnojiva)
WHERE naziv_gnoj = NEW.naziv_gnoj;
ELSE
RAISE_APPLICATION_ERROR('Nedovoljna količina na zalihi!');
END IF;
END;


phpMyAdmin javlja ovo:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE trenutno NUMBER; BEGIN SELECT kolicina INTO trenutno FROM zalihaG WHERE ' at line 6

lp
Igor

[Ovu poruku je menjao farkZ dana 13.05.2012. u 11:34 GMT+1]
[ farkZ @ 13.05.2012. 11:21 ] @
Ako umjesto '$$' delimitera stavim '//' , onda dobijam ovaj error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('Nedovoljna koliÄ
[ farkZ @ 13.05.2012. 12:46 ] @
pronašao sam zanimljiv primjer:
Raise Exception / Error in MySQL 5.0

Pokušao sam odmah, nakon što sam executnuo one procedure gore;
Code:

.....
ELSE
CALL pRaiseError("Nedostatna kolicina na zalihi!");
END IF;
....


količina na zalihi se ne promijeni, novi redak se ne upiše (što je ok), ali ne izleti nikakvo upozorenje za korisnika
lp
Igor
[ farkZ @ 21.05.2012. 22:29 ] @
Eto:
There are some limitations on what can appear in statements that a trigger executes when activated:

The trigger cannot use the CALL statement to invoke stored procedures that return data to the client or that use dynamic SQL. (Stored procedures are permitted to return data to the trigger through OUT or INOUT parameters.)

The trigger cannot use statements that explicitly or implicitly begin or end a transaction such as START TRANSACTION, COMMIT, or ROLLBACK.

LINK



Code:

CREATE TRIGGER update_zalihaP
......code ......
WHERE naziv_prep = NEW.naziv_prep;
ELSE
UPDATE `Error` SET x=1;
END IF
END


gdje bi triger napravio update nepostojeće tablice (ukoliko je korisnik unio veću težinu nego je ima na lageru), tj. ne bi napravio ništa, pa se redak koji bi se inače unio ne unese (i zaliha se ne promijeni) jer je količina prevelika, što je u redu, ali bi bilo još bolje da mogu napraviti da iskoči neka obavijest...:), ovo ne radi, količina na zalihi recimo bude 0, ali se količine još uvijek mogu dodavati
hvala
f


[Ovu poruku je menjao farkZ dana 22.05.2012. u 00:08 GMT+1]
[ bogdan.kecman @ 22.05.2012. 01:12 ] @
koristi mysql 5.5 i SIGNAL / RESIGNAL
[ farkZ @ 23.05.2012. 12:40 ] @
Citat:
bogdan.kecman: koristi mysql 5.5 i SIGNAL / RESIGNAL


bogdane hvala
ovo će poslužiti za sada, dok host ne updejta na mysql 5.5
Code:

....
   WHERE nesto= NEW.nesto;
        ELSE
            CALL nepostojecaproc;
        END IF;
END;