Subject | Re: PK field that auto filled with wrong generator value |
---|---|
Author | russellbelding |
Post date | 2012-05-06T08:04:59Z |
Hello Cipto
I am still a bit puzzled and say again: Perhaps my questions will provoke a thought to you which brings insight.
D=Detail and M=Master as abbreviations you use?
You show the sql for qrtbBeliD and join to table tbBarang.
When you insert a record to qrtbBeliD the primary key d."id" is given a value whose source is unknown. In particular you are confident the integer primary key does not come from generator gentbBeliD.
1. Could you simplify this problem using two similar and simpler tables. Remove all fields except the primary keys and the linking fields. If the problem is still present post the simpler details here. If the problem is not presnt, add more fields till the problem appears.
2. If this were my code I'd use a generator and trigger for both tables and remove the primary key insertion from the OnPostEvent. Your method "feels" messy and maybe the event code runs too many times. The code looked correct.
3. I see you are using d."names" not d.names. You have a reason for this. Then I see you use :"id" . How you you use the :"id"? (paramByName(??).asInteger := 33)
I don't know if is is safe or legal to use double quotes around parameters. Could you do a simple experiment? use :MyID (new name and without quotes) instead and see if the problem goes away?
Kind regards,
Russell
I am still a bit puzzled and say again: Perhaps my questions will provoke a thought to you which brings insight.
D=Detail and M=Master as abbreviations you use?
You show the sql for qrtbBeliD and join to table tbBarang.
When you insert a record to qrtbBeliD the primary key d."id" is given a value whose source is unknown. In particular you are confident the integer primary key does not come from generator gentbBeliD.
1. Could you simplify this problem using two similar and simpler tables. Remove all fields except the primary keys and the linking fields. If the problem is still present post the simpler details here. If the problem is not presnt, add more fields till the problem appears.
2. If this were my code I'd use a generator and trigger for both tables and remove the primary key insertion from the OnPostEvent. Your method "feels" messy and maybe the event code runs too many times. The code looked correct.
3. I see you are using d."names" not d.names. You have a reason for this. Then I see you use :"id" . How you you use the :"id"? (paramByName(??).asInteger := 33)
I don't know if is is safe or legal to use double quotes around parameters. Could you do a simple experiment? use :MyID (new name and without quotes) instead and see if the problem goes away?
Kind regards,
Russell
--- In IBObjects@yahoogroups.com, "Cipto" <cipto.milis@...> wrote:
>
> conIBO is a TIBODatabase component with tiCommitted isolation
>
> Yes I have UpdateSQL on qrTbBeliD, the code is generate automatically by
> TIBOQuery feature.
>
> The "id" field of tbBeliD.ID is never visible to users when they using this
> program. So the user cann't make it null when it already has a value from
> generator "genTbBeliD". Yes I fill tbBeliD.ID on event OnBeforePost of
> qrTbBeliD, the value from this OnBeforePost event is never wrong.
>
> The problem is when user add a new record of qrTbBeliD, the value of
> tbBeliD.ID is automatically filled by tbBeliM.ID which is I don't write
> any single code from Delphi or from trigger of that table to make this
> happen. That looks like TIBOQuery automatically do that.
>
> If it's automatically do by TIBOQuery then it's wrong because the relation
> between the master (qrTbBeliM) and the detail (qrTbBeliD) is on "id" field
> of qrTbBeliM and the "idTbBeliM" field of qrTbBeliD.
>
> I put qrTbBeliM and qrTbBeliD in a master detail relationship (both
> qrTbBeliM and qrTbBeliD are the name of TIBOQuery component).
> The master detail relationship that I do is:
> 1. Set the datasource property of qrTbBeliD to the TDatasource of qrTbBeliM
> 2. Make the SQL property of qrTbBeliD to have a param to "id". Here is the
> SQL property of qrTbBeliD:
> select d."id", d."idTbBeliM", d."idTbBarang", d."idTbGudang", d."qty",
> d."satuan", d."konversi", d."qtyKecil",
> d."hargaSat", d."disc", d."subTotal", d."ongkosKirim",
> b."kode", b."nama", b."partNumber", b."satKecil"
> from "tbBeliD" d
> join "tbBarang" b on b."id"=d."idTbBarang"
> where d."idTbBeliM"=:"id" // ====> Here the SQL that said that this
> qrTbBeliD "id" param refer to qrTbBeliM.ID
> order by d."id"
>
>
> Hope make you clear at this point. Thank you for your patience. I'm from
> Indonesia. TIA
>
>
> ----- Original Message -----
> From: russellbelding
> To: IBObjects@yahoogroups.com
> Sent: Saturday, May 05, 2012 5:30 AM
> Subject: [IBO] Re: PK field that auto filled with wrong generator value
>
> Hello Cipto
>
> There are some details in your post I do not get. What is conIBO? I don't
> want to guess.
>
> Other details could influence the problem. In your TIBOQuery named qrTbBeliD
> do you have Update SQL?
>
> If tbBeliD.ID is the primary key for table tbBeliD then when qrtbBeliD
> records will never be null at the time they are loaded into your client
> program. The OnPostEvent will succeed in changing the ID
> value only if this value is null. So the ID value will change by this event
> only if it has been edited from a value to null.
>
> When your client adds a new record to table tbBeliD by entering a new record
> into qrtbBeliD and if the ID value is null then when this new record is
> posted the event fills the ID value from generator gentbBeliD. Is this what
> is happening? If so how are you determining that the ID value is wrong?
>
> Maybe my comments will prompt some thought to you that leads to insight. (I
> don't get the full picture.)
>
> HTH.
>
> --- In IBObjects@yahoogroups.com, "Cipto" <cipto.milis@> wrote:
> >
> > Sorry for my bad English. That's not what I mean.
> >
> > I don't have any trigger on "tbBeliD" table. Yes, the d."id" is the
> > primary
> > key, and I will assign it's value from Delphi (OnBeforePost event of
> > qrTbBeliD (TIBOQuery component)) with the same meaning code as you write
> > from trigger:
> >
> > if qrTbBeliDid.IsNull then
> > qrTbBeliDid.AsLargeInt:=conIBO.Gen_ID('"genTbBeliD"', 1);
> >
> >
> > The question is when the program add a new record of qrTbBeliD, why the
> > "id"
> > field of qrTbBeliD always auto filled with "id" field from qrTbBeliM?
> > There
> > is no single code on my trigger or on OnNewRecord event of qrTbBeliD that
> > assign that value. It's automatically filled by the TIBOQuery component
> > and
> > it's wrong.
> >
> >
> > ----- Original Message -----
> > From: russellbelding
> > To: IBObjects@yahoogroups.com
> > Sent: Friday, May 04, 2012 3:14 PM
> > Subject: [IBO] Re: PK field that auto filled with wrong generator value
> >
> > When you use event OnBeforePost the action is taken before the TIBO_NN
> > object has data changes posted. Each time you change the table used and
> > save
> > the changes a post is done. So the field D.ID is changed each time the
> > table
> > changes.
> >
> > If D.ID is the primary key for your table and you want a unique key in
> > this
> > field each time you insert a record you could use a "before insert"
> > trigger
> > on the table.
> >
> > if (new.ID is null) then
> > new.ID = gen_id(generatorname, 1);
> >
> > > > I also have a generator called "genTbBeliD".
> > > >
> > > > Now the problem is:
> > > > Everytime I insert a new record on "tbBeliD" (just still in insert
> > > > condition, before post) why the field d."id" is automatically filled
> > > > with an integer value that I don't know where it come from??
> > > >
> > > > I'm not set any propoerty of TIBO_Query or TIBO_Database to
> > > > automatically fill the "id" field from any generator, because I
> > > > explicitly fill d."id" value onBeforePost of TIBO_Query with this
> > > > statement:
> > > > if qrTbBeliDid.IsNull then
> > > > qrTbBeliDid.AsLargeInt:=conIBO.Gen_ID('"genTbBeliD"', 1);
> > > >
> > > > Any clue??
> > > >
> > > > TIA
>