Duplicated records from business entity.

Posted by OctavioOlguin on 25-Aug-2015 17:21

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,

All Replies

Posted by Mike Fechner on 26-Aug-2015 00:40

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).

Posted by OctavioOlguin on 26-Aug-2015 09:29

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.

Posted by Peter Judge on 26-Aug-2015 09:36

Ocatavio,

Also make sure that the data in the json longchar doesn't contain any duplicates.

Posted by OctavioOlguin on 26-Aug-2015 10:14

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!!

Posted by OctavioOlguin on 26-Aug-2015 10:17

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

Posted by OctavioOlguin on 26-Aug-2015 10:30

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

Posted by OctavioOlguin on 27-Aug-2015 12:33

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

This thread is closed