[progress Communities] [progress Openedge Abl] Forum Post: Re: Addidfield With Angular 2

Status
Not open for further replies.
M

Martin Velikov

Guest
I have some problems maybe with create method. This is the way I made it working, but I am not sure how good it is. But when I use cSkipListArray[1] = "ClientNum". it stop working. The problem is: {"_retVal":"","_errors":[{"_errorMsg":"** Client already exists with ClientNum 0. (132)","_errorNum":0}]} /*------------------------------------------------------------------------ File : AdvClients Syntax : Author(s) : Administrator Created : Wed Apr 05 15:10:05 EEST 2017 Notes : ----------------------------------------------------------------------*/ @program FILE(name="AdvClients.cls", module="AppServer"). @openapi.openedge.export FILE(type="REST", executionMode="singleton", useReturnValue="false", writeDataSetBeforeImage="false"). @progress.service.resource FILE(name="AdvClients", URI="/AdvClients", schemaName="dsClient", schemaFile="CtcIdea\AppServer\advclients.i"). USING Progress.Lang.*. USING OpenEdge.BusinessLogic.BusinessEntity FROM PROPATH. USING Progress.Json.ObjectModel.*. BLOCK-LEVEL ON ERROR UNDO, THROW. CLASS AdvClients INHERITS BusinessEntity: /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ {"advclients.i"} DEFINE DATA-SOURCE srcClient FOR projects.Client. DEFINE VARIABLE iSeq AS INTEGER NO-UNDO. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ CONSTRUCTOR PUBLIC AdvClients(): DEFINE VAR hDataSourceArray AS HANDLE NO-UNDO EXTENT 1. DEFINE VAR cSkipListArray AS CHAR NO-UNDO EXTENT 1. SUPER (DATASET dsClient:HANDLE). /* Data Source for each table in dataset. Should be in table order as defined in DataSet */ hDataSourceArray[1] = DATA-SOURCE srcClient: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: Notes: ------------------------------------------------------------------------------*/ METHOD PRIVATE VOID JFPFillMethod(INPUT filter AS CHARACTER): DEFINE VARIABLE jsonParser AS ObjectModelParser NO-UNDO. DEFINE VARIABLE jsonObject AS JsonObject NO-UNDO. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE hQuery AS HANDLE NO-UNDO. DEFINE VARIABLE lUseReposition AS LOGICAL NO-UNDO. DEFINE VARIABLE iCount AS INTEGER NO-UNDO. DEFINE VARIABLE ablFilter AS CHARACTER NO-UNDO. DEFINE VARIABLE id AS CHARACTER INITIAL ? NO-UNDO. DEFINE VARIABLE iMaxRows AS INTEGER INITIAL ? NO-UNDO. DEFINE VARIABLE iSkipRows AS INTEGER INITIAL ? NO-UNDO. DEFINE VARIABLE cOrderBy AS CHARACTER INITIAL "" NO-UNDO. /* purge any existing data */ EMPTY TEMP-TABLE ttClient. jsonParser = NEW ObjectModelParser(). jsonObject = CAST(jsonParser:parse(filter), jsonObject). iMaxRows = jsonObject:GetInteger("top") NO-ERROR. iSkipRows = jsonObject:GetInteger("skip") NO-ERROR. ablFilter = jsonObject:GetCharacter("ablFilter") NO-ERROR. id = jsonObject:GetCharacter("id") NO-ERROR. cOrderBy = jsonObject:GetCharacter("orderBy") NO-ERROR. cWhere = "WHERE " + ablFilter NO-ERROR. IF cOrderBy > "" THEN DO: cOrderBy = REPLACE(cOrderBy, ",", " by "). cOrderBy = "by " + cOrderBy + " ". /* NOTE: id and seq fields should be removed from cWhere and cOrderBy */ cOrderBy = REPLACE(cOrderBy, "by id desc", ""). cOrderBy = REPLACE(cOrderBy, "by id ", ""). cOrderBy = REPLACE(cOrderBy, "by seq desc", ""). cOrderBy = REPLACE(cOrderBy, "by seq ", ""). END. lUseReposition = iSkipRows <> ?. IF iMaxRows <> ? AND iMaxRows > 0 THEN DO: BUFFER ttClient:HANDLE:BATCH-SIZE = iMaxRows. END. ELSE DO: IF id > "" THEN BUFFER ttClient:HANDLE:BATCH-SIZE = 1. ELSE BUFFER ttClient:HANDLE:BATCH-SIZE = 0. END. BUFFER ttClient:ATTACH-DATA-SOURCE(DATA-SOURCE srcClient:HANDLE). IF cOrderBy = ? THEN cOrderBy = "". cWhere = IF cWhere > "" THEN (cWhere + " " + cOrderBy) ELSE ("WHERE " + cOrderBy). DATA-SOURCE srcClient:FILL-WHERE-STRING = cWhere. IF lUseReposition THEN DO: hQuery = DATA-SOURCE srcClient:QUERY. hQuery:QUERY-OPEN. IF id > "" AND id <> "?" THEN DO: hQuery:REPOSITION-TO-ROWID(TO-ROWID(id)). END. ELSE IF iSkipRows <> ? AND iSkipRows > 0 THEN DO: hQuery:REPOSITION-TO-ROW(iSkipRows). IF NOT AVAILABLE Client THEN hQuery:GET-NEXT() NO-ERROR. END. iCount = 0. REPEAT WHILE NOT hQuery:QUERY-OFF-END AND iCount "" THEN DATA-SOURCE srcClient:RESTART-ROWID(1) = TO-ROWID ((id)). BUFFER ttClient:SET-CALLBACK ("AFTER-ROW-FILL", "AddIdField"). DATASET dsClient:FILL(). END. FINALLY: BUFFER ttClient:DETACH-DATA-SOURCE(). END FINALLY. END METHOD. METHOD PUBLIC VOID AddIdField (INPUT DATASET dsClient): ASSIGN ttClient.id = STRING(ROWID(Client)) iSeq = iSeq + 1 ttClient.seq = iSeq. END. /*------------------------------------------------------------------------------ Purpose: Get one or more records, based on a filter string Notes: ------------------------------------------------------------------------------*/ @openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="true"). @progress.service.resourceMapping(type="REST", operation="read", URI="?filter=~{filter~}", alias="", mediaType="application/json"). @openapi.openedge.method.property (name="mappingType", value="JFP"). @openapi.openedge.method.property (name="capabilities", value="ablFilter,top,skip,id,orderBy"). METHOD PUBLIC VOID ReadClients( INPUT filter AS CHARACTER, OUTPUT DATASET dsClient): IF filter BEGINS "~{" THEN THIS-OBJECT:JFPFillMethod (INPUT filter). ELSE DO: BUFFER ttClient:HANDLE:BATCH-SIZE = 0. BUFFER ttClient:SET-CALLBACK ("AFTER-ROW-FILL", "AddIdField"). SUPER:ReadData(filter). END. END METHOD. /*------------------------------------------------------------------------------ Purpose: Create one or more new records Notes: ------------------------------------------------------------------------------*/ @openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="false"). @progress.service.resourceMapping(type="REST", operation="create", URI="", alias="", mediaType="application/json"). METHOD PUBLIC VOID CreateClients(INPUT-OUTPUT DATASET dsClient): define buffer bClient for Client. define variable itemp as int no-undo. find last bClient use-index clientnum exclusive-lock no-error. if not available bclient then itemp = 1. else itemp = bclient.clientnum + 1. dataset dsClient::ttClient:FIND-FIRST (). if DATASET dsClient::ttClient::clientnum = 0 then DATASET dsClient::ttClient::clientnum = itemp. SUPER:CreateData(DATASET dsClient BY-REFERENCE). END METHOD. /*------------------------------------------------------------------------------ Purpose: Update one or more records Notes: ------------------------------------------------------------------------------*/ @openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="false"). @progress.service.resourceMapping(type="REST", operation="update", URI="", alias="", mediaType="application/json"). METHOD PUBLIC VOID UpdateClients(INPUT-OUTPUT DATASET dsClient): SUPER:UpdateData(DATASET dsClient BY-REFERENCE). END METHOD. /*------------------------------------------------------------------------------ Purpose: Delete a record Notes: ------------------------------------------------------------------------------*/ @openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="false"). @progress.service.resourceMapping(type="REST", operation="delete", URI="", alias="", mediaType="application/json"). METHOD PUBLIC VOID DeleteClients(INPUT-OUTPUT DATASET dsClient): SUPER:DeleteData(DATASET dsClient BY-REFERENCE). END METHOD. /*------------------------------------------------------------------------------ Purpose: Submit a record Notes: ------------------------------------------------------------------------------*/ @openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="true"). @progress.service.resourceMapping(type="REST", operation="submit", URI="/SubmitClients (IN-OUT dataset)", alias="", mediaType="application/json"). METHOD PUBLIC VOID SubmitClients(INPUT-OUTPUT DATASET dsClient): /* Calling extending class's CUD methods instead of SUPER:Submit() in case customized functionality was added. Do deletes first, next modifies, and finally creates */ THIS-OBJECT:DeleteClients(DATASET dsClient). THIS-OBJECT:UpdateClients(DATASET dsClient). THIS-OBJECT:CreateClients(DATASET dsClient). END METHOD. /* ----------------------------------------- */ @openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="false"). @progress.service.resourceMapping(type="REST", operation="invoke", URI="/count?filter=~{filter~}", alias="", mediaType="application/json"). METHOD PUBLIC VOID count( INPUT filter AS CHARACTER, OUTPUT numRecs AS INTEGER): DEFINE VARIABLE jsonParser AS ObjectModelParser NO-UNDO. DEFINE VARIABLE jsonObject AS JsonObject NO-UNDO. DEFINE VARIABLE ablFilter AS CHARACTER NO-UNDO. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE qh AS HANDLE NO-UNDO. IF filter BEGINS "WHERE " THEN cWhere = filter. ELSE IF filter BEGINS "~{" THEN DO: jsonParser = NEW ObjectModelParser(). jsonObject = CAST(jsonParser:parse(filter), jsonObject). ablFilter = jsonObject:GetCharacter("ablFilter") NO-ERROR. cWhere = "WHERE " + ablFilter. END. ELSE IF filter NE "" THEN DO: /* Use filter as WHERE clause */ cWhere = "WHERE " + filter. END. CREATE QUERY qh. qh:SET-BUFFERS(BUFFER Client:HANDLE). qh:QUERY-PREPARE("PRESELECT EACH Client " + cWhere). qh:QUERY-OPEN (). numRecs = qh:NUM-RESULTS. END METHOD. END CLASS.

Continue reading...
 
Status
Not open for further replies.
Top