Greetings.
I had an issue that I was investigating, and spend qute some time testing different scenarios, but today I just found the same fault on other business entity, so I think there is something I don't quite understand yet about BE.
I have the following code
USING dw.dwTicketD FROM PROPATH. DEFINE INPUT PARAMETER pJson1 AS LONGCHAR NO-UNDO. DEFINE OUTPUT PARAMETER pResult AS LOGICAL NO-UNDO INITIAL NO. {"dw\dwticketD.i"} DEFINE VARIABLE myTicketD AS CLASS dw.dwTicketD NO-UNDO. DEFINE VARIABLE lRetOK AS LOGICAL NO-UNDO. /* *************************** Main Block *************************** */ myTicketD = NEW dw.dwTicketD() . lRetOK = DATASET dsdwTicketD:READ-JSON("LONGCHAR", pJson1, "EMPTY"). /*DATASET dsdwTicketD:WRITE-JSON ("file", "C:\appserver\log" + horatrx, YES).*/ myTicketD:CreatedwTicketD(INPUT-OUTPUT DATASET dsdwTicketD).
And this is dwticketD.i, wich I won't be surprised to find is the culprit.
DEFINE TEMP-TABLE ttdwTicketD BEFORE-TABLE bttdwTicketD FIELD Sucursal AS INTEGER INITIAL "1" LABEL "?" FIELD Almacen AS INTEGER INITIAL "1" LABEL "?" FIELD Serie AS CHARACTER LABEL "?" FIELD Ticket AS INTEGER INITIAL "0" LABEL "?" FIELD Fecha AS DATE INITIAL "?" LABEL "?" FIELD NumPartida AS INTEGER INITIAL "0" LABEL "?" FIELD Articulo AS CHARACTER LABEL "Artículo" FIELD Linea AS CHARACTER LABEL "?" FIELD Sublinea AS CHARACTER LABEL "SubLinea" FIELD Empaque AS CHARACTER LABEL "?" FIELD Cantidad AS DECIMAL INITIAL "0" LABEL "?" FIELD Precio AS DECIMAL INITIAL "0" LABEL "?" FIELD Impuesto1 AS DECIMAL INITIAL "0" LABEL "IEPS" FIELD Impuesto2 AS DECIMAL INITIAL "0" LABEL "IVA" FIELD StatusTicketD AS CHARACTER LABEL "?" FIELD StatusDevolucion AS LOGICAL INITIAL NO LABEL "Devolucion" FIELD Costo AS DECIMAL INITIAL "0" LABEL "Costo" FIELD Observaciones AS CHARACTER LABEL "?" FIELD Comision AS DECIMAL INITIAL "0" LABEL "Comisión al Vendedor" FIELD NumSeries AS CHARACTER LABEL "Núms de Serie" FIELD SubTotal AS DECIMAL INITIAL "0" LABEL "?" FIELD Cliente AS CHARACTER LABEL "?" FIELD PesoBruto AS DECIMAL INITIAL "0" LABEL "?" FIELD Etiqueta AS CHARACTER LABEL "?" FIELD Control# AS DECIMAL INITIAL "0" LABEL "?" FIELD PV AS INTEGER INITIAL "0" LABEL "?" INDEX ClientePrecio Cliente DESCENDING Fecha DESCENDING Articulo DESCENDING Precio DESCENDING INDEX SucArtFecha Sucursal DESCENDING Articulo DESCENDING Fecha DESCENDING INDEX SuclFechCaja Sucursal DESCENDING Fecha DESCENDING PV DESCENDING INDEX TicketD IS PRIMARY Sucursal DESCENDING Almacen DESCENDING Serie DESCENDING Ticket DESCENDING INDEX TicketNum Ticket DESCENDING . DEFINE DATASET dsdwTicketD FOR ttdwTicketD.
Sory... the problem is that in this table, I get dupplicated rows for every record sent in on the json parameter.
Is there something I don't know?
Thanks in advance.
Jorge Olguín,
Any details on the error you are seeing? How many records are in the json document?
Generally, some of the ProDataset methods (e.g. MERGE-CHANGES) require a PRIMARY UNIQUE Index on the temp-tables (not necessarily on the DB).
Hi Mike! Thanks.
I'll investigate about the primary key for the dataset. The source table is a child table in a parent -child relation, and the dataset has 80% times betwen 2 and 4 items, the rest,1 and at most 7 or 8 records. and the result I got is double records on destination table.
I'll keep it posted...
Thanks again.
Ocatavio,
Also make sure that the data in the json longchar doesn't contain any duplicates.
I commented out the wirte-json instruction above, and got this:
{"dsdwTicketD": { "ttdwTicketD": [ { "Sucursal": 8, "Almacen": 8, "Serie": "A", "Ticket": 970301, "Fecha": "2015-08-26", "NumPartida": 35376, "Articulo": "HUESO CER", "Linea": "CER", "Sublinea": "CER", "Empaque": "KG", "Cantidad": 0.429, "Precio": 7.0, "Impuesto1": 0.0, "Impuesto2": 0.0, "StatusTicketD": "P", "StatusDevolucion": false, "Costo": 3.01, "Observaciones": "", "Comision": 0.0, "NumSeries": "", "SubTotal": 3.0, "Cliente": "VM", "PesoBruto": 0.41, "Etiqueta": "Hueso cer", "Control#": 0.0, "PV": 1 }, { "Sucursal": 8, "Almacen": 8, "Serie": "A", "Ticket": 970301, "Fecha": "2015-08-26", "NumPartida": 35344, "Articulo": "PIERNA CER", "Linea": "CER", "Sublinea": "CER", "Empaque": "KG", "Cantidad": 0.544, "Precio": 45.0, "Impuesto1": 0.0, "Impuesto2": 0.0, "StatusTicketD": "P", "StatusDevolucion": false, "Costo": 45.0, "Observaciones": "", "Comision": 0.0, "NumSeries": "", "SubTotal": 24.5, "Cliente": "VM", "PesoBruto": 0.54, "Etiqueta": "Pierna", "Control#": 0.0, "PV": 1 } ] }}
and on the app, got this:
and the following code:
FOR EACH dwh.dwTicketD WHERE dwTicketD.Sucursal = dwTicket.Sucursal AND dwTicketD.Ticket = dwTicket.Ticket NO-LOCK : DISPLAY dwTicketD.Articulo dwTicketD.Cantidad WITH DOWN 2 COL FRAME sdfghbs VIEW-AS DIALOG-BOX THREE-D. END. READKEY.
embedded on a temporary button on the form, throws as expected:
SO the problema I missing is somewhere in:
BLOCK-LEVEL ON ERROR UNDO, THROW. USING dw.dwTicketD FROM PROPATH. DEFINE INPUT PARAMETER pJson1 AS LONGCHAR NO-UNDO. DEFINE OUTPUT PARAMETER pResult AS LOGICAL NO-UNDO INITIAL NO. DEFINE VARIABLE horatrx AS CHARACTER NO-UNDO. ASSIGN horatrx = REPLACE(REPLACE(REPLACE (STRING(NOW), "/", "_"), ":", "."), " ", "-"). DEFINE STREAM salida. {"dw\dwticketD.i"} /* *************************** Definitions ************************** */ DEFINE VARIABLE lRetOK AS LOGICAL NO-UNDO. DEFINE VARIABLE myTicketD AS CLASS dw.dwTicketD NO-UNDO. DEFINE VARIABLE foo AS INTEGER NO-UNDO. /* *************************** Main Block *************************** */ myTicketD = NEW dw.dwTicketD() . lRetOK = DATASET dsdwTicketD:READ-JSON("LONGCHAR", pJson1, "EMPTY"). /*DATASET dsdwTicketD:WRITE-JSON ("file", "C:\temp\TicketD-log" + horatrx, YES).*/ myTicketD:CreatedwTicketD(INPUT-OUTPUT DATASET dsdwTicketD). ASSIGN pResult = YES. CATCH mySys AS Progress.Lang.SysError : COPY-LOB pJson1 TO FILE horatrx. MESSAGE "Sys error " foo ": " mySys:GetMessage(foo) " Archivo: " "C:\appserver\log" + horatrx. DO foo = 1 TO mySys:NUMMESSAGES: RUN FUNC\BITACORA.P(TODAY,STRING(TIME,"HH:MM:SS"), 10502, USERID("TAP"), 1 ,"Error en rutina de App Server (Progress.Lang.SysError)", "Rutina: 'pdwTicketD.p', error: " + mySys:GetMessage(1) ). END. ASSIGN pResult = NO. END CATCH. CATCH myApp AS Progress.Lang.AppError : MESSAGE "App error: " myApp:GetMessage(1) . RUN FUNC\BITACORA.P(TODAY,STRING(TIME,"HH:MM:SS"), 10502, USERID("TAP"), 1 ,"Error en rutina de App Server (Progress.Lang.AppError)", "Rutina: 'pdwTicketD.p', error: " + myApp:GetMessage(1) ). ASSIGN pResult = NO. END CATCH.
Any clue?
Thanks!!
And there is dwTicketD.cls (the relevant part)
USING Progress.Lang.*. USING OpenEdge.BusinessLogic.BusinessEntity. BLOCK-LEVEL ON ERROR UNDO, THROW. CLASS dw.dwTicketD INHERITS BusinessEntity: /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ {"DW\dwticketd.i"} DEFINE DATA-SOURCE srcdwTicketD FOR dwh.dwTicketD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ CONSTRUCTOR PUBLIC dwTicketD(): DEFINE VAR hDataSourceArray AS HANDLE NO-UNDO EXTENT 1. DEFINE VAR cSkipListArray AS CHAR NO-UNDO EXTENT 1. SUPER (DATASET dsdwTicketD:HANDLE). /* Data Source for each table in dataset. Should be in table order as defined in DataSet */ hDataSourceArray[1] = DATA-SOURCE srcdwTicketD:HANDLE. /* Skip-list entry for each table in dataset. Should be in temp-table order as defined in DataSet */ /* Each skip-list entry is a comma-separated list of field names, to be ignored in create stmt */ cSkipListArray[1] = "". THIS-OBJECT:ProDataSource = hDataSourceArray. THIS-OBJECT:SkipList = cSkipListArray. END CONSTRUCTOR. /*------------------------------------------------------------------------------ Purpose: Get one or more records, based on a filter string Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC VOID ReaddwTicketD( INPUT filter AS CHARACTER, OUTPUT DATASET dsdwTicketD): SUPER:ReadData(filter). END METHOD. /*------------------------------------------------------------------------------ Purpose: Create one or more new records Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC VOID CreatedwTicketD(INPUT-OUTPUT DATASET dsdwTicketD): DEFINE VAR hDataSet AS HANDLE NO-UNDO. hDataSet = DATASET dsdwTicketD:HANDLE. SUPER:CreateData(DATASET-HANDLE hDataSet BY-REFERENCE). END METHOD. . . . .
????
TIA
Jorge Olguin
Sorry...!!!
Forgot to mention, that before these test and post, I changed the original dwTicketD.i to:
DEFINE TEMP-TABLE ttdwTicketD BEFORE-TABLE bttdwTicketD FIELD Sucursal AS INTEGER INITIAL "1" LABEL "?" FIELD Almacen AS INTEGER INITIAL "1" LABEL "?" FIELD Serie AS CHARACTER LABEL "?" FIELD Ticket AS INTEGER INITIAL "0" LABEL "?" FIELD Fecha AS DATE INITIAL "?" LABEL "?" FIELD NumPartida AS INTEGER INITIAL "0" LABEL "?" FIELD Articulo AS CHARACTER LABEL "Artículo" FIELD Linea AS CHARACTER LABEL "?" FIELD Sublinea AS CHARACTER LABEL "SubLinea" FIELD Empaque AS CHARACTER LABEL "?" FIELD Cantidad AS DECIMAL INITIAL "0" LABEL "?" FIELD Precio AS DECIMAL INITIAL "0" LABEL "?" FIELD Impuesto1 AS DECIMAL INITIAL "0" LABEL "IEPS" FIELD Impuesto2 AS DECIMAL INITIAL "0" LABEL "IVA" FIELD StatusTicketD AS CHARACTER LABEL "?" FIELD StatusDevolucion AS LOGICAL INITIAL NO LABEL "Devolucion" FIELD Costo AS DECIMAL INITIAL "0" LABEL "Costo" FIELD Observaciones AS CHARACTER LABEL "?" FIELD Comision AS DECIMAL INITIAL "0" LABEL "Comisión al Vendedor" FIELD NumSeries AS CHARACTER LABEL "Núms de Serie" FIELD SubTotal AS DECIMAL INITIAL "0" LABEL "?" FIELD Cliente AS CHARACTER LABEL "?" FIELD PesoBruto AS DECIMAL INITIAL "0" LABEL "?" FIELD Etiqueta AS CHARACTER LABEL "?" FIELD Control# AS DECIMAL INITIAL "0" LABEL "?" FIELD PV AS INTEGER INITIAL "0" LABEL "?" INDEX TicketD IS PRIMARY UNIQUE Sucursal DESCENDING Ticket DESCENDING NumPartida DESCENDING . DEFINE DATASET dsdwTicketD FOR ttdwTicketD.
Note the slimed index structure and also the unique PK
(NumPartida is as a Row Number (as OrderLine?)
Thanks in advance
SOLVED!
My blessed user!!!
He uses double-click for whatever item on screen, be it a button, the close window control button, link on webpage... you name it.. Double-click on everythink that moves!!! Damn nigths sticked to computer checking every E on FOR EACH....
This enforces knowledge I got from here,Every record needs it's UPK (unique primary key)
Thanks.
Jorge Olguin