DKNFs even *with* -p [long; lots o' code]
Bruce Easton
bruce at stn.com
Tue Jun 19 12:36:41 PDT 2007
Jay R. Ashworth wrote Monday, June 18, 2007 11:26 AM:
>
> On an unrelated topic, I'm having a problem with a pair of files to
> which I'm writing lots of records in a batch (currently about 2000).
>
> This is an inventory file, and I whack it down to about 40 or 50 hand
> entered records (using processing you'll see below), reindex it with
> -ra -e, and then pour the records into it (code also below), with all
> lookups flagged as -nxp.
>
> I'm in a loop, working on the second table to get it exactly right, so
> I have to run the first one multiple times as well. When I do, *even*
> if I reindex both tables *after* the mass delete as well as before, the
> delete code trips DKNF errors.
>
> Only for one index on each file: on sviinvtr it's E; on sviinvfr, B;
> the other indices -- and there are quite a number; far more than the 40
> or so records which I am *not* deleting -- do *not* show up in the DKNF
> dialogs as I spin through them.
>
> No other processing touches either file within my whack-populate-test
> loop.
>
> This seems odd; does anyone have any suggestions before I dump this on
> fpsupport?
>
> Cheers,
> -- jra
>
>
> /usr/local/bin/invwhack:
> ==========================================
> # whack the inventory files for a fresh reimport
> dxmaint sviinvtr -ra -e
> dxmaint sviinvfr -ra -e
> dreport sviinvtr -f whack -s whack -h "Whacking sviinvtr"
> dreport sviinvfr -f whack -s whack -h "Whacking sviinvfr"
> ==========================================
>
> prc.whack:
> ==========================================
> ::' sviinvtr/whack - delete records:
> start:::
> ::delete; end:
> ==========================================
>
> sel.whack:
> ==========================================
> hassn and not audit
> audit:2:eq:AUDIT
> hassn:297:ne:
> :::
> :::
> :::
> :::
> :::
> :::
> :::
> :::
> :::
> :::
> ==========================================
>
>
> prc.push:
> ==========================================
> ::' post all imported inventory items to sviinvtr/sviinvfr:
> ::' custom for ${CUSTOMER}:
> ::' written 29-Jan-07 by jra at microsys.us:
> ::':
> start::':
> ::' the full serial number is the key; we check both the inventory:
> ::' files and the archives -- put the record into the resp inventory:
> ::' file unless it's in the resp archive; handle independently:
> ::':
> ::lookup invt=sviinvtr k=1 i=A -nxp:
> :not invt:lookup invtx=sviinvtx k=1 i=A -nxp:
> :invtx:end ' if in the invt archive, skip:
> ::':
> ::lookup invf=sviinvfr k=1 i=A -nxp:
> :not invf:lookup invfx=sviinvfx k=1 i=A -nxp:
> :invfx:end ' if in the invf archive, skip:
> :: ' unlikely to skip here, but...:
> ::':
> ::' on the pricing file, try to create one record per subcat:
> ::lookup invp=sviinvpr k=3 i=A -nxp:
> :not invp:lookup invp=sviinvpr r=free -nxp:
> ::':
> ::' and finally, create or update a bulk price record:
> ::' figure out which warehouse:
> ::'debug on:
> ::gosub whse:
> ::sk(15,allup)=3 ' trim off the SN to SKU:
> :2 eq "LAPTOP":mid(sk,"13","3")="L/T" ' if a laptop, so tag:
> ::lookup invb=sviinvtr k=(sk&wh) i=P -nxp:
> :invb:goto cont1:
> ::lookup invb=sviinvtr r=free -nxp:
> ::gosub newbulk:
> ::':
> cont1:::
> ::' if invt, update it, if not create; same with invf:
> :invt:gosub updinvt:
> :not invt:gosub newinvt:
> :invf:gosub updinvf:
> :not invf:gosub newinvf:
> ::gosub updinvp:
> ::gosub updinvb:
> ::end:
> ::':
> newinvt:::
> ::' lookup a free record in the live file, then fall through:
> ::lookup invt=sviinvtr r=free -nxp:
> :not invt:show "@Couldn't get free sviinvtr record; out of disk?
> Yell for help"; exit:
> updinvt:::
> ::invt(3)=1; invt(297)=1 ' serial number:
> ::invb(6)=wh ' warehouse:
> ::invt(288)=2 ' category:
> ::invt(289)=3 ' subcat:
> ::invt(12)=4 ' mfg:
> ::invt(4)=6<"/"<5 ' model/desc:
> :5 eq 6:invt(4)=5:
> ::invt(295)=8<"/"<7 ' loc/bin:
> ::invt(305)=8 ' loc also:
> ::invt(31)=11 ' supplier #:
> ::invt(91)= "1" ' Qty dmd:
> ::':
> ::' other fields per dmd:
> ::invt(14)="R" ' Refurb:
> ::invt(16)="N" ' Taxable:
> ::invt(30)="1" ' default vendor:
> ::invt(11)="ZZZZZZZZZZZZZZZ" ' Non Serial Grouping #:
> ::invt(21)="5000";invt(22)="100" ' Sales Accts:
> ::invt(23)="1200";invt(24)="000" ' Inv Accts:
> ::invt(25)="4000";invt(26)="100" ' COGS Accts:
> ::invt(101)="EA" ' Stk unit of measure:
> ::invt(102)="EA" ' Sell "" "":
> ::invt(103)="EA" ' Buy unit of measure:
> ::invt(104)="1" ' Sell Conversion:
> ::invt(105)="1" ' Buy Conversion:
> ::invt(150)="F" ' Commission
> percentage fixed:
> ::return:
> ::':
> newinvf:::
> ::' lookup a free record in the live file, then fall through:
> ::lookup invf=sviinvfr r=free -nxp:
> :not invf:show "@Couldn't get free sviinvfr record; out of disk?
> Yell for help"; exit:
> updinvf:::
> ::' don't fill in warehouse for now; must xref to warehouse file:
> ::'invf(1)=8 ' location:
> ::invf(2)=1 ' serial number:
> ::invf(3)=5<"/"<6 ' model/desc:
> :5 eq 6:invf(3)=5:
> ::invf(7)=1 ' full serial number:
> ::return:
> ::':
> updinvp:::
> ::invp(1)=3 ' subcat tag:
> ::return:
> ::':
> updinvb:::
> ::invb(91)=invb(91) + "1" ' qty on hand:
> ::return:
> ::':
> whse:::
> ::' is this a warehouse other than NJ?:
> ::wh(3,allup)="NJ" ' default here:
> ::' at the moment, we're not getting warehouse as a field in the:
> ::' DBF files, so we apply some heuristics:
> :8 eq "FLORIDA":wh="FL":
> :7 eq "FLORIDA":wh="FL":
> ::return:
> ::':
> newbulk:::
> ::' lookup a free record in the live file, then fall through:
> ::invb(3)=sk; invb(297)=3 ' serial number:
> ::invb(2)="BULK" ' BULK item class:
> ::invb(6)=wh ' warehouse:
> ::invb(288)=2 ' category:
> ::invb(289)=3 ' subcat:
> ::invb(12)=4 ' mfg:
> ::' this will only acquire a valid description on non-new categories:
> ::invb(4)=invp(2) ' model/desc:
> ::invb(295)=8<"/"<7 ' loc/bin:
> ::invb(305)=8 ' loc also:
> ::invb(31)=11 ' supplier #:
> ::invb(91)="0" ' updinvb will bump this:
> ::':
> ::' other fields per dmd:
> ::invb(14)="R" ' Refurb:
> ::invb(16)="N" ' Taxable:
> ::invb(30)="1" ' default vendor:
> ::invb(11)="ZZZZZZZZZZZZZZZ" ' Non Serial Grouping #:
> ::invb(21)="5000";invb(22)="100" ' Sales Accts:
> ::invb(23)="1200";invb(24)="000" ' Inv Accts:
> ::invb(25)="4000";invb(26)="100" ' COGS Accts:
> ::invb(101)="EA" ' Stk unit of measure:
> ::invb(102)="EA" ' Sell "" "":
> ::invb(103)="EA" ' Buy unit of measure:
> ::invb(104)="1" ' Sell Conversion:
> ::invb(105)="1" ' Buy Conversion:
> ::invb(150)="F" ' Commission
> percentage fixed:
> ::return:
> ::':
> ==========================================
>
> If the maps and index lists seem germane, let me know and I'll post them
> as well.
> --
> Jay R. Ashworth Baylink
Jay - how is the "push" process called?
Bruce
Bruce Easton
STN, Inc.
More information about the Filepro-list
mailing list