[RESOLVIDO] Editor progress conectar ao Appserver.

Discussão em 'WebSpeed' iniciado por samuelfac, Maio 6, 2011.

  1. samuelfac

    samuelfac Sem Pontuação

    Olá pessoal, pesquisei aqui no fórum e não encontrei nada sobre isso.

    Tenho um Appserver já configurado e rodando com o nome "appteste". Gostaria de conectar a ele pelo meu editor progress.

    Na documentação do Progress encontrei algumas maneiras mas nao consegui fazer rodar. Segue o código que estou tentando rodar:
    Código:
    DEFINE VARIABLE gscSessionID AS CHARACTER   NO-UNDO.
    DEFINE VARIABLE gshAstraAppServer               AS HANDLE     NO-UNDO.
    
    DEFINE TEMP-TABLE ttService
        FIELD cServiceName AS CHAR
        FIELD cConnectParams AS CHAR.
    
    DEFINE TEMP-TABLE AppSrv-TT
        FIELD partition AS CHAR
        FIELD Configuration AS LOG.
    
    /*DEFINE  SHARED TEMP-TABLE AppSrv-TT
           FIELD Partition     AS CHARACTER FORMAT "X(25)"
           FIELD Host          AS CHARACTER FORMAT "X(15)"  /* NS -H parameter      */
           FIELD Service       AS CHARACTER FORMAT "X(15)"  /* NS -S parameter      */
           FIELD Configuration AS LOGICAL   FORMAT "Remote/Local"
           FIELD Security      AS LOGICAL   FORMAT "Prompt/No"
           FIELD Info          AS CHARACTER LABEL  "AppServer Information" FORMAT "X(255)"
           FIELD AS-Handle     AS HANDLE                    /* Handle if connected  */
           FIELD App-Service   AS CHARACTER LABEL  "Application Service" FORMAT "X(25)"
           FIELD Conn-Count    AS INTEGER   LABEL  "Pseudo connections" INITIAL 0
           FIELD PartitionType AS CHARACTER FORMAT "X(10)" 
           FIELD ServerURL     AS CHARACTER FORMAT "X(255)"
        INDEX Partition IS PRIMARY UNIQUE Partition
        INDEX App-Service App-Service
        INDEX PartitionType PartitionType.*/
    
    
    DEFINE VARIABLE hDynUser AS HANDLE     NO-UNDO.
    
    
    FUNCTION isConnected RETURNS LOGICAL
      ( INPUT pcServiceName AS CHARACTER )  FORWARD.
    
    FUNCTION parseConnectionParams RETURNS CHARACTER
      (INPUT pcParams AS CHARACTER )  FORWARD.
    
    
    
    PROCEDURE connectService :
    /*------------------------------------------------------------------------------
      Purpose:     Connects a physical service for a given service name
      Parameters:  <none>
      Notes:       This procedure is a required entry point for the Connection
                   Manager.
    ------------------------------------------------------------------------------*/
      DEFINE INPUT  PARAMETER pcServiceName AS CHARACTER  NO-UNDO.
      DEFINE OUTPUT PARAMETER pcHandle      AS CHARACTER  NO-UNDO.
    
      RUN connectServiceWithParams( INPUT pcServiceName, 
                                    INPUT "":U, 
                                    INPUT "":U, 
                                    OUTPUT pchandle).
    END PROCEDURE.
    
    PROCEDURE connectServiceWithParams :
    /*------------------------------------------------------------------------------
      Purpose:     
      Parameters:  <none>
      Notes:       
    ------------------------------------------------------------------------------*/
      DEFINE INPUT  PARAMETER pcServiceName      AS CHARACTER  NO-UNDO.
      DEFINE INPUT  PARAMETER pcParameterList    AS CHARACTER  NO-UNDO.
      DEFINE INPUT  PARAMETER pcSubstitutionList AS CHARACTER  NO-UNDO.
      DEFINE OUTPUT PARAMETER pcHandle           AS CHARACTER  NO-UNDO.
    
      DEFINE VARIABLE cConnectString        AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cUserName             AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cPassword             AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE lRunLocal             AS LOGICAL    NO-UNDO.
      DEFINE VARIABLE hServer               AS HANDLE     NO-UNDO.
      DEFINE VARIABLE lAns                  AS LOGICAL    NO-UNDO.
      DEFINE VARIABLE lDefault              AS LOGICAL    NO-UNDO.
      DEFINE VARIABLE cAppServerInfo        AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cSessionType          AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cPhysSessType         AS CHARACTER  NO-UNDO.
      define variable cPhysicalService      as character no-undo.
        
        /* Check whether there's a connection already made to the 
           actual AppServer (ie the physical service). If so, re-use
           the connection, while keeping the (logical) service name. */
        cPhysicalService = {fnarg getPhysicalService pcServiceName}.
        hServer = dynamic-function('findConnectedPhysicalService':u in target-procedure,
                                   cPhysicalService, '':u /* service name not required */).
        
        /* We use this value regardless of whether we've reused the connection. */    
        lDefault = {fnarg isDefaultService pcServiceName}.
        
        if not valid-handle(hServer) then
        do:
          /* cAppServerInfo contains several parameters in a string. This string is passed
                 as the AppServerInfo parameter in the connect method so that the as_connect.p
                 procedure can parse these values out for use by the AppServer. */
        
          cPhysSessType  = DYNAMIC-FUNCTION("getPhysicalSessionType":U IN THIS-PROCEDURE).
          IF cPhysSessType = ? THEN
            cPhysSessType = "?":U.
        
          cAppServerInfo = "VER:2.1A":U + CHR(3) 
                         + cPhysSessType + CHR(3)
                         + SESSION:NUMERIC-SEPARATOR + CHR(3) 
                         + SESSION:NUMERIC-DECIMAL-POINT + CHR(3)
                         + SESSION:DATE-FORMAT + CHR(3)
                         + STRING(SESSION:YEAR-OFFSET) + CHR(3).
            
          cSessionType = DYNAMIC-FUNCTION("getSessionParam":U IN THIS-PROCEDURE,
                                          "ICFSESSTYPE":U).
        
          IF cSessionType = ? THEN
            cSessionType = "?":U.
        
          cAppServerInfo = cAppServerInfo + cSessionType + CHR(3).
               
          IF lDefault AND
             gscSessionID <> "":U AND
             gscSessionID <> ? THEN
            cAppServerInfo = cAppServerInfo + gscSessionID.
        
          /*{aficfcheck.i}    */
        
          /* Get the connection parameters */
          cConnectString = DYNAMIC-FUNCTION("getConnectionString":U IN THIS-PROCEDURE,
                                            INPUT pcServiceName ).
          IF cConnectString = ? THEN
            RETURN "INVALID CONNECTION STRING":U.
        
          lRunLocal = cConnectString = "<LOCAL>":U.
        
          IF NOT lRunLocal THEN DO:
              /* Now append the parameter list to the connection string */
              IF ( pcParameterList > "":U ) THEN
                ASSIGN cConnectString = cConnectString + " ":U + pcParameterList.
        
              /* Now invoke the substitute param to substitute list */
              RUN substituteParams IN TARGET-PROCEDURE (INPUT cConnectString, 
                                   INPUT pcSubstitutionList,
                                   OUTPUT cConnectString).
        
              lRunLocal = DYNAMIC-FUNCTION("getSessionParam":U IN THIS-PROCEDURE,
                                         "run_local":U) = "YES":U.
          END.
        
          IF lRunLocal THEN
          DO:
            pcHandle = STRING(SESSION).
            DYNAMIC-FUNCTION("setServiceHandle":U IN THIS-PROCEDURE, 
                             pcServiceName, pcHandle).
            RETURN.
          END.
        
          IF isConnected(pcServiceName) THEN
            RUN disconnectService (pcServiceName).
        
          /* Connect to the AppServer with a generated user name and password */
          cUserName = DYNAMIC-FUNCTION("generateUserName":U IN hDynUser).
          cPassword = DYNAMIC-FUNCTION("createPassword":U IN hDynUser, cUserName).
        
          /* Now create the server and connect it */
          CREATE SERVER hServer.
          lAns = hServer:CONNECT(cConnectString,cUserName,cPassword,cAppServerInfo) NO-ERROR.
        
          IF ERROR-STATUS:ERROR OR
             ERROR-STATUS:NUM-MESSAGES <> 0 OR
             lAns <> YES THEN
            RETURN DYNAMIC-FUNCTION('buildErrorList':U IN THIS-PROCEDURE).
        end.    /* Re-usable connection */
            
      pcHandle = STRING(hServer).
    
      DYNAMIC-FUNCTION('setServiceHandle':U IN THIS-PROCEDURE,
                        INPUT pcServiceName,
                        INPUT pcHandle). 
    
      IF lDefault = YES THEN
      DO:
        gshAstraAppServer = hServer.
        gscSessionID = hServer:CLIENT-CONNECTION-ID.
      END.
    
    END PROCEDURE.
    
    
    PROCEDURE disconnectService :
    /*------------------------------------------------------------------------------
      Purpose:     This procedure is responsible for disconnecting a
                   physical service.
      Parameters:  <none>
      Notes:       This procedure is a required entry point for the Connection
                   Manager.
    ------------------------------------------------------------------------------*/
      DEFINE INPUT  PARAMETER pcServiceName AS CHARACTER  NO-UNDO.
    
      DEFINE VARIABLE hServer  AS HANDLE     NO-UNDO.
      DEFINE VARIABLE lAns     AS LOGICAL    NO-UNDO.
      DEFINE VARIABLE lDefault AS LOGICAL    NO-UNDO.
        define variable hOtherServer            as handle no-undo.  
        define variable cPhysicalService        as character no-undo.
    
      /* Get the handle to the AppServer */
      hServer = WIDGET-HANDLE(DYNAMIC-FUNCTION('getServiceHandle':U IN THIS-PROCEDURE,
                                                  INPUT pcServiceName)).
        
      IF NOT VALID-HANDLE(hServer) OR
         hServer = SESSION:HANDLE THEN
        RETURN.
    
        /* Look for another logical connection using this physical
           connection. */
        cPhysicalService = {fnarg getPhysicalService pcServiceName}.
        hOtherServer = dynamic-function('findConnectedPhysicalService':u in target-procedure,
                                        cPhysicalService, pcServiceName).
        
      lDefault = DYNAMIC-FUNCTION("isDefaultService":U IN THIS-PROCEDURE,
                              INPUT pcServiceName ).
        
        /* Only delete the service if there's no connection sharing going on.
           If there's another logical service using this physical service, then 
           don't delete the physical service. */
        if hServer ne hOtherServer then
        do:
            IF hServer:CONNECTED() THEN
                hServer:DISCONNECT().
            DELETE OBJECT hServer.
        end.    /* there's another service on this connection */
          
      DYNAMIC-FUNCTION('setServiceHandle':U IN THIS-PROCEDURE,
                       INPUT pcServiceName,
                       INPUT ?). 
    
      IF lDefault = YES THEN
        gshAstraAppServer = ?.
     
    END PROCEDURE.
    
    
    PROCEDURE initializeSelf :
    /*------------------------------------------------------------------------------
      Purpose:     
      Parameters:  <none>
      Notes:       
    ------------------------------------------------------------------------------*/
      
      /* Get the handle to af/app/afddo.p - ICF is not running so we can't get this
         from the Session manager. The function "getProcedureHandle" lives in the
         Configuration File Manager which is a SESSION super procedure */
      RUN startProcedure IN THIS-PROCEDURE ("ONCE|af/app/afdynuser.p":U, OUTPUT hDynUser) NO-ERROR.
    
      /* If the handle to hDynUser is invalid, then start it. */
      IF NOT VALID-HANDLE(hDynUser) THEN
        RUN "af/app/afdynuser.p":U PERSISTENT SET hDynUser.
    END PROCEDURE.
    
    
    PROCEDURE plipShutdown :
    /*------------------------------------------------------------------------------
      Purpose:     Cleans up the AppServer connections when the AppServer
                   Manager is shut down.
      Parameters:  <none>
      Notes:       
    ------------------------------------------------------------------------------*/
      DEFINE BUFFER bttService FOR ttService.
    
      FOR EACH bttService:
        RUN disconnectService(bttService.cServiceName).
      END.
    
      EMPTY TEMP-TABLE AppSrv-TT.
      
      gshAstraAppServer = ?.
    
      IF NOT VALID-HANDLE(hDynUser) THEN
        DELETE OBJECT hDynUser.
    
      DELETE OBJECT THIS-PROCEDURE.
    
    END PROCEDURE.
    
    
    PROCEDURE reconnectService :
    /*------------------------------------------------------------------------------
      Purpose:     
      Parameters:  <none>
      Notes:       
    ------------------------------------------------------------------------------*/
      DEFINE INPUT  PARAMETER pcServiceName AS CHARACTER  NO-UNDO.
      DEFINE OUTPUT PARAMETER pcHandle      AS CHARACTER  NO-UNDO.
    
      /* Clean up the old handle */
      RUN disconnectService (pcServiceName).
    
      /* Connect the service again */
      RUN connectService (pcServiceName, OUTPUT pcHandle).
    
    
    
    END PROCEDURE.
    
    
    PROCEDURE registerService :
    /*------------------------------------------------------------------------------
      Purpose:     Super Override
      Parameters:  
      Notes:       
    ------------------------------------------------------------------------------*/
    
      DEFINE INPUT PARAMETER phServiceBuff AS HANDLE NO-UNDO.
      DEFINE VARIABLE cParseConnect AS CHARACTER  NO-UNDO.
    
      /* Code placed here will execute PRIOR to standard behavior. */
    
      RUN SUPER(INPUT phServiceBuff).
    
      IF AVAILABLE(ttService) THEN
      DO:
        ASSIGN cParseConnect = parseConnectionParams(ttService.cConnectParams).
        FIND AppSrv-TT
             WHERE AppSrv-TT.partition = ttService.cServiceName
             NO-ERROR.
    
        IF NOT AVAILABLE AppSrv-TT 
        THEN DO:
            CREATE AppSrv-TT.
            ASSIGN AppSrv-TT.partition = ttService.cServiceName.
        END.
        ASSIGN AppSrv-TT.Configuration = NOT (cParseConnect = "<LOCAL>":U).
      END.
    
      /* Code placed here will execute AFTER standard behavior.    */
    
    END PROCEDURE.
    
    
    PROCEDURE security_prompt :
    /*------------------------------------------------------------------------------
      Purpose:     This is a procedure that was called in the as-utils.
                   This is here for backward compatibility.
      Parameters:  <none>
      Notes:       
    ------------------------------------------------------------------------------*/
      DEFINE OUTPUT PARAMETER lCancel AS LOGICAL              NO-UNDO.
    
      lCancel = FALSE.
    
    END PROCEDURE.
    
    
    FUNCTION isConnected RETURNS LOGICAL
      ( INPUT pcServiceName AS CHARACTER ) :
    /*------------------------------------------------------------------------------
      Purpose:  Determines whether the requested service type is connected.
        Notes:  
    ------------------------------------------------------------------------------*/
      DEFINE VARIABLE lAns    AS LOGICAL    NO-UNDO.
      DEFINE VARIABLE hServer AS HANDLE     NO-UNDO.
      /* Get the handle to the AppServer */
      hServer = WIDGET-HANDLE(DYNAMIC-FUNCTION('getServiceHandle':U IN THIS-PROCEDURE,
                                                  INPUT pcServiceName)).
      IF VALID-HANDLE(hServer) THEN 
      DO:
        IF hServer = SESSION:HANDLE THEN
          lAns = YES.
        ELSE
          lAns = hServer:CONNECTED().
      END.
    
      RETURN lAns.   /* Function return value. */
    
    END FUNCTION.
    
    FUNCTION parseConnectionParams RETURNS CHARACTER
      (INPUT pcParams AS CHARACTER ) :
    /*------------------------------------------------------------------------------
      Purpose:  Parses pcParams and returns the connection string.
        Notes:  
    ------------------------------------------------------------------------------*/
      DEFINE VARIABLE cConnectString AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cMode          AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cString1       AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cString2       AS CHARACTER  NO-UNDO.
      DEFINE VARIABLE cClientType    AS CHARACTER  NO-UNDO.
      
      /* Parse the string to determine what parameters to use */
      cMode = ENTRY(1,pcParams,CHR(3)).
    
      IF NUM-ENTRIES(pcParams,CHR(3)) > 1 THEN
        cString1 = ENTRY(2,pcParams,CHR(3)).
    
      IF NUM-ENTRIES(pcParams,CHR(3)) > 2 THEN
        cString2 = ENTRY(3,pcParams,CHR(3)).
    
      CASE cMode:
        WHEN "R":U OR
        WHEN "U":U THEN
          cConnectString = cString1.
        WHEN "D":U THEN
        DO:
          cClientType = DYNAMIC-FUNCTION("getPhysicalSessionType":U IN THIS-PROCEDURE).
          IF cClientType = "WBC":U THEN
            cConnectString = cString2.
          ELSE
            cConnectString = cString1.
        END.
        OTHERWISE
          cConnectString = "<LOCAL>":U.
      END.
    
      RETURN cConnectString.   /* Function return value. */
    
    END FUNCTION.
    
    
    DEFINE VARIABLE pcHandle AS HANDLE      NO-UNDO.
    
    RUN connectService (INPUT "appteste",
      OUTPUT  pcHandle).´


    Quero conectar ao appserver, usar as conexoes existentes dele. Não quero conectar aos bancos com o PF do appserver.

    Quando rodo o codigo acima, ocorre os seguintes erros:

    Funcao definida pelo usuario 'getPhysicalService', foi chamada dinamicamente mas nao pode ser encontrada. (5639)
    Funcao definida pelo usuario 'findConnectedPhysicalService', foi chamada dinamicamente mas nao pode ser encontrada. (5639)
    Funcao definida pelo usuario 'isDefaultService', foi chamada dinamicamente mas nao pode ser encontrada. (5639)
    Funcao definida pelo usuario 'getPhysicalSessionType', foi chamada dinamicamente mas nao pode ser encontrada. (5639)
    Funcao definida pelo usuario 'getSessionParam', foi chamada dinamicamente mas nao pode ser encontrada. (5639)
    Funcao definida pelo usuario 'getConnectionString', foi chamada dinamicamente mas nao pode ser encontrada. (5639)



    Alguém pode me ajudar?
  2. samuelfac

    samuelfac Sem Pontuação

    Re: Editor progress conectar ao Appserver.

    Segundo a documentacao do Progress (CONNECT method, AppServer)

    posso fazer assim:

    Código:
    DEFINE VARIABLE vconnectstring AS CHARACTER   NO-UNDO.
    DEFINE VARIABLE hServer AS HANDLE      NO-UNDO.
    DEFINE VARIABLE lconectou AS LOGICAL     NO-UNDO.
    
    ASSIGN vconnectstring = "-H localhost -S 6080 -AppService appteste".
    
    CREATE SERVER hServer.
    /***********************/
    ASSIGN lconectou = hServer:CONNECT(vConnectString, ?, ?, ?) .
    /***********************/
    
    MESSAGE  "conectou: " lconectou
    VIEW-AS ALERT-BOX.
    

    mas ao fazer isso, ocorre o seguinte erro:

    ---------------------------
    Erro
    ---------------------------
    Connection failure for host localhost port 6080 transport UDP. (9407)
    ---------------------------
    OK
    ---------------------------

    E não conecta, alguem pode me ajudar?
  3. kirchner

    kirchner Membro Participativo Moderador

    Re: Editor progress conectar ao Appserver.

    samuelfac,

    No parâmetro -S você deve informar a porta do NameServer, que normalmente é 5162.
    Confirma essa porta e verifica se o NameServer está ativo.
  4. samuelfac

    samuelfac Sem Pontuação

    Re: Editor progress conectar ao Appserver.



    Vaaaleuuu!!

    era isso mesmo. Funcionou com a porta 5162!!!

    Muito Obrigado kirchner.


    Código que funcionou a conexão:
    Código:
    DEFINE VARIABLE vconnectstring AS CHARACTER   NO-UNDO.
    DEFINE VARIABLE hServer AS HANDLE      NO-UNDO.
    DEFINE VARIABLE conectou AS LOGICAL     NO-UNDO.
    
    ASSIGN vconnectstring = "-H 127.0.0.1 -S 5162 -AppService appteste".
    
    CREATE SERVER hServer.
    ASSIGN conectou = hServer:CONNECT(vConnectString, ?, ?, ?) .
    
    MESSAGE  "conectou: " conectou
    VIEW-AS ALERT-BOX.

Compartilhe esta Página