20
TIPOS DE ACCESO DE BÚFER DE DATOS 1. Clase field 2. Clase record 3. Clase row 4. Clase rowset La relación entre estas 4 clases puede entenderse mejor como sigue. El Field - es un subconjunto de Registros, este es un subconjunto de fila (Row), es un subconjunto de Conjunto de filas (Rowset). No se confunda la "clase record" con un "record" DESCRIPCIÓN DEL ACCESO DE BÚFER DE DATOS Esta sección trata sobre: Acceso al buffer de datos. Clases de acceso. Modelo de búfer de datos y objetos de acceso a datos. ACCESO BUFFER DE DATOS Además de las funciones incorporadas que se utilizan para acceder a la memoria intermedia de componentes, clases de objetos están disponibles que proporcionan acceso a los almacenamientos intermedios de datos estructurados utilizando la sintaxis de objeto PeopleCode. Los buffers de datos accedidos por estas clases suelen ser los buffers de componentes que se cargan cuando se abre un componente. Sin embargo, estas clases también pueden ser utilizados para acceder a los datos de los búferes de datos generales, cargados por un programa de aplicación de motor, una interfaz de componente, y así sucesivamente. Los métodos y las propiedades de estas clases ofrecen una funcionalidad que es similar a lo que ha estado disponible utilizando las funciones integradas. Sin embargo, también proporcionan una mayor consistencia, flexibilidad y nuevas funcionalidades. Clases de acceso Las cuatro clases de búfer de datos son: rowset, row, record y Field. Estas cuatro clases son la base para el acceso a datos del búfer componente a través de la nueva sintaxis de objeto. Un objeto de campo, que se crea una instancia de la clase Field, es una sola instancia de los datos dentro de un registro. Se basa en una definición de campo. Un objeto de registro, que se crea una instancia de la clase Record, es una sola instancia de una de datos dentro de una fila. Se basa en una definición de registro. Un objeto de registro se compone de uno a n campos. Un objeto de fila, que se crea una instancia de la clase de row, es una única fila de datos que consiste de uno a N registros de datos. Una sola fila en un área de desplazamiento de componentes es una fila. Una fila

rowset.pdf

Embed Size (px)

Citation preview

Page 1: rowset.pdf

TIPOS DE ACCESO DE BÚFER DE DATOS

1. Clase field 2. Clase record

3. Clase row

4. Clase rowset La relación entre estas 4 clases puede entenderse mejor como sigue.

El Field - es un subconjunto de Registros, este es un subconjunto de fila (Row), es un subconjunto de Conjunto de filas (Rowset).

No se confunda la "clase record" con un "record"

DESCRIPCIÓN DEL ACCESO DE BÚFER DE DATOS Esta sección trata sobre:

Acceso al buffer de datos. Clases de acceso.

Modelo de búfer de datos y objetos de acceso a datos.

ACCESO BUFFER DE DATOS Además de las funciones incorporadas que se utilizan para acceder a la

memoria intermedia de componentes, clases de objetos están

disponibles que proporcionan acceso a los almacenamientos intermedios de datos estructurados utilizando la sintaxis de objeto PeopleCode.

Los buffers de datos accedidos por estas clases suelen ser los buffers de componentes que se cargan cuando se abre un componente. Sin

embargo, estas clases también pueden ser utilizados para acceder a los datos de los búferes de datos generales, cargados por un programa de

aplicación de motor, una interfaz de componente, y así sucesivamente. Los métodos y las propiedades de estas clases ofrecen una funcionalidad

que es similar a lo que ha estado disponible utilizando las funciones integradas. Sin embargo, también proporcionan una mayor consistencia,

flexibilidad y nuevas funcionalidades. Clases de acceso

Las cuatro clases de búfer de datos son: rowset, row, record y Field. Estas cuatro clases son la base para el acceso a datos del búfer

componente a través de la nueva sintaxis de objeto.

Un objeto de campo, que se crea una instancia de la clase Field, es una sola instancia de los datos dentro de un registro. Se basa en una

definición de campo. Un objeto de registro, que se crea una instancia de la clase Record, es

una sola instancia de una de datos dentro de una fila. Se basa en una definición de registro. Un objeto de registro se compone de uno

a n campos. Un objeto de fila, que se crea una instancia de la clase de row, es una

única fila de datos que consiste de uno a N registros de datos. Una sola fila en un área de desplazamiento de componentes es una fila. Una fila

Page 2: rowset.pdf

puede tener de uno a n hijos conjuntos de filas. Por ejemplo, una fila en

un área de desplazamiento de dos niveles puede tener n nivel de tres conjuntos de filas de hijos.

Un objeto Rowset es una estructura de datos que se utiliza para

describir los datos jerárquicos. Se compone de una colección de filas. Un área de desplazamiento componente es un rowset. Usted también puede

tener un rowset de nivel cero.

BUFFER DE DATOS DEL MODELO Y DE ACCESO A DATOS DE CLASES El modelo de datos asumido por las clases de memoria intermedia de

datos es la de un componente de PeopleTools, donde se utilizan barras de desplazamiento (scroll) o grids para describir una estructura de datos

jerárquica, múltiples ocurrencia. Se puede acceder a estas clases utilizando notación de puntos.

Las cuatro clases de memoria intermedia de datos se relacionan entre sí de una manera jerárquica. Los puntos principales para entender estas

relaciones son: Un record contiene uno o más campos.

Una row contiene uno o más registros y cero o más conjuntos de

rows hijos. Un rowset contiene una o más rows.

Para buffers componentes, pensar en un rowset como un área de

desplazamiento en una página que contiene todos los datos de esa área de desplazamiento. Un rowset de nivel cero contiene todos los datos

para todo el componente. Puede usar rowset con los mensajes de aplicación, estructura de ficheros, interrelaciones de negocios, y otras

definiciones, además de los componentes. A nivel rowset cero desde un buffer componente sólo contiene un fila: las teclas que el usuario

específico para iniciar dicho componente. A nivel de rowset cero a partir de datos que no es un componente, como un mensaje o un diseño de

archivo, puede contener más de un nivel de fila cero.

CLASE ROWSET Un objeto rowset, es una instancia de la clase rowset, es una coleccion

de filas asociadas con un bufer de datos. El componente scroll es un rowset. Puedes tener solo un rowset a nivel cero.

Si se crea un objeto rowset se crea una instancia utilizando GetRowset (ya sea la función o uno de los métodos) el objeto rowset se crean

instancias y se rellena con datos de acuerdo con el contexto en el que se crea la instancia.

Si se crea un objeto rowset se crea una instancia utilizando la función CreateRowset, el objeto rowset es instanciado es un rowset

Page 3: rowset.pdf

independiente. Todos los records(registros) y fields(campos) creadas

por esta función se inicializan con valores nulos, es decir, ellos no contienen ningún dato. Puede rellenar este objeto rowset usando el

CopyTo, Fill, o métodos FillAppend.

El procesamiento por default no se realiza en un rowset independiente. Un rowset independiente no esta ligado a un procesador de

componente. Cuando llenas con datos peoplecode no corre (por ejemplo RowInsert, FieldDefault). Delete e Insert, esta actividad en este tipo de

rowset no se aplica automaticamente para ahorrar tiempo. Usar Rowset independientes para trabajar con records.

Puedes usar el objeto rowset y la propiedad ActiveRowCount para iterar sobre las filas del rowset, o acceder a una fila especifica (usando el

metodo GetRow) o para encontrar el nombre del record primario asociado con el scroll (la propiedad DBName).

La clase rowset es una de las clases de acceso de búfer de datos. CONSIDERACIONES DE ACCESO DIRECTO

El método por default para la clase Rowset es GetRow. Esto significa que puede especificar justo el número de fila, y no utilizar el método

GetRow. Por ejemplo, las siguientes dos líneas de código son

equivalentes: &myrow = GetRowset () (5);

&myrow = GetRowset () GetRow (5).;

TIPOS DE DATO DEL OBJETO ROWSET El objeto rowset se declara de tipo rowset: Local Rowset &myrowset;

ALCANCES DE UN OBJETO ROWSET

Un rowset puede ser instanciado por pleoplecode o usando java. Este objeto se puede utilizar en donde quiera que se tenga PeopleCode,

es decir, en una clase de aplicación, record field PeopleCode. No se puede pasar un objeto rowset en el marco de un método definido

por el usuario de interfaz de componente. (Rowset no son estructuras de datos comunes fuera de un sistema de PeopleSoft.) Sin embargo,

dentro de un método definido por el usuario para una interfaz de componente puede utilizar objetos rowset.

En un Application Engine, un objeto rowset es el equivalente de un objeto record que contiene una fila y un solo registro, es decir, el State

Record. PeopleSoft sugiere utilizar el objeto Record en lugar de un objeto rowset para obtener acceso al State Record.

Los mensajes tienen la misma estructura que los rowset, es decir, las estructuras de datos jerárquicos componen de filas, registros y campos.

Objetos file pueden tener la misma estructura que los rowset, es decir,

las estructuras de datos jerárquicos componen de filas, registros y campos.

FUNCIONES INCORPORADAS DE LA CLASE ROWSET

Page 4: rowset.pdf

CreateRowset

Sintaxis: CreateRowset({RECORD.recname | &Rowset} [, {FIELD.fieldname,

RECORD.recname | &Rowset}] . . .)

Use la función CreateRowset para crear un rowset independiente vacio.

Un Rowset independiente es un rowset con una estructura especificada, pero no esta ligado a ningún dato (es decir, al buffer de componente o a

un mensaje). Ademas, un rowset independiente no esta ligado a un procesador de componente. Cuando lo llenas con datos, no hay

peoplecode corriendo (como RowInsert, FieldDefault, etc). El primer parámetro determina la estructura del rowset que se esta

creando. Si tu especificas un record en el primer parámetro, se usa el record

primario de nivel 0. Si tu no especificas ningún otro parámetro, se creas un rowset conteniendo una fila, con un registro vacío o despoblado. Tu

puedes poblar o llenar este tipo de rowset con datos, solo puedes usar solamente:

El método de la clase rowset Fill o FillAppend

Un método record (SelectByKey) La función SQLExec

Si tu especificas un objeto rowset, tu estas creando un nuevo rowset basado en la estructura del objeto rowset que estas especificando.

Incluyendo los rowset hijos. Lo hara no contendiendo ningún dato. Si tu quieres llenar o poblar este tipo de rowset con datos, usa el método

CopyTo o una sentencia SQL. Nota: No debes usar los métodos del rowset Select o SelectNew para

poblar o llenar rowset creados usando CreateRowset. Use la instancia Fill o FillAppend.

Restricciones usando CreateRowset Los siguientes métodos y propiedades no trabajan cuando creamos

rowset usando CreateRowset: Select

SelectNew

Caulquier método GUI(como HideAllRows) Cualquier método o propiedades de fecha efectiva(como EFFDT,

EFFSEQ o GETCURREFFROW) Ademas, los rowset creados usando CreateRowset no están ligados

automáticamente a la base de datos. Esto significa que si insertas o borras filas, las filas no serán insertadas o borradas en la base de datos

cuando yo guardes la página. Parametros:

Record.recname | &Rowset Especifica cualquier un nombre de record o un objeto rowset

existente.

Page 5: rowset.pdf

FIELD.fieldname, RECORD.recname | &Rowset

Use FIELD.fieldname, RECORD.recname para especificar

un registro relacionado en pantalla. FIELD.fieldname se

refiere al control del campo, mientras RECORD.recname se

refiere al record relacionado en pantalla.

Si especifica &Rowset, va a

agregar un objeto rowset secundario al rowset recién

creado. Este debe ser un objeto

rowset existente.

Retornos Un objeto rowset independiente vacio.

Ejemplo: El siguiente código crea un rowset simple de un solo registro por fila: &RS = CreateRowset(RECORD.QA_MYRECORD);

El siguiente código crea un rowset con la misma estructura de un rowset

específico: &RS2 = CreateRowset(&RS);

El siguiente código crea un rowset con una estructura compuesta por 4 records en estructura jerarquica, es decir: QA_INVEST_HDR

QA_INVEST_LN

QA_INVEST_TRANS

QA_INVEST_DTL

Nota: tiene que comenzar por la parte inferior de la jerarquía, y agregar los niveles superiores. Local Rowset &RS, &RS2, &RS_FINAL;

&RS2 = CreateRowset(RECORD.QA_INVEST_DTL);

&RS = CreateRowset(RECORD.QA_INVEST_TRANS, &RS2);

&RS2 = CreateRowset(RECORD.QA_INVEST_LN, &RS);

&RS_FINAL = CreateRowset(RECORD.QA_INVEST_HDR, &RS2);

El siguiente ejemplo lee todos los registros de QA_MYRECORD dentro del

rowset, y retorna el número de filas leidas: &RS = CreateRowset(RECORD.QA_MYRECORD);

&NUM_READ = &RS.Fill();

Para hacer un clone de un rowset existente, es decir, para hacer dos

copias distintas, tu debes hacer lo siguiente: &RS2 = CreateRowset(&RS);

&RS.CopyTo(&RS2);

Page 6: rowset.pdf

El siguiente condigo de ejemplo es usado para crear multiples hijos en

un rowset independiente: Local Rowset &rsBOCMRole, &rsBOCMRel, &rsBOCMUse;

&rsBOCMRole = CreateRowset(Record.BO_CM_ROLE);

&rsBOCMRel = CreateRowset(Record.BO_CM_REL);

&rsBOCMUse = CreateRowset(Record.BO_CM_USE);

&rsBOCM = CreateRowset(Record.BO_CM, &rsBOCMUse, &rsBOCMRole,

&rsBOCMRel);

Get Rowset

Sintasis: GetRowset([SCROLL.scrollname])

Use la función GetRowset para obtener un objeto rowset basado en el

contexto actual. Es decir, el rowset se determina a partir de un row que contiene el programa que se está ejecutando.

Consideraciones de sintaxis de formato Una expresión de la forma RECORD.scrollname.property

o RECORD.scrollname.method(. . .)

se convierte en una expresión de objeto por el uso de GetRowset

(SCROLL. scrollname). Parámetro

Si se especifica un parámetro, que debe ser el nombre del registro principal para el desplazamiento de que es un hijo del actual contexto.

Retornos Sin parámetros, GetRowset retorna un objeto rowset para el rowset que

contiene el programa actualmente en ejecución. Si se especifica un parámetro, este devuelve un rowset para este hijo scroll.scrollname

debe ser el nombre del registro principal para el desplazamiento. Ejemplo

En el siguiente ejemplo, RS1 es un rowset de nivel 1, y RS2 es un rowset hijo de RS1. Local Rowset &RS1, &RS2;

&RS1 = GetRowset();

&RS2 = GetRowset(SCROLL.EMPL_CHKLST_ITM);

METODOS DE LA CLASE ROWSET

CopyTo: Clonar un Rowset DeleteRow: Eliminar logicamente una Fila (RowCount)

Flush: Eliminar Fisicamente todas las filas (RowCount’s)

InsertRow: Insertar una Fila al Rowset HideAllRows: Ocultar todas las Filas

ShowAllRows: Muestra todas las Filas del Rowset

Page 7: rowset.pdf

CopyTo Sintaxis CopyTo(&DestRowset [, record_list])

Dónde record_list es una lista de nombres de los registros en la forma: [RECORD.source_recname1, RECORD.target_recname1

[, RECORD.source_recname2, RECORD.target_recname2]]. . .

Descripción

El método CopyTo copia del rowset de la ejecución del método para el rowset de destino determinado, como la copia nombrando campos de

registro y subscrolls en los niveles correspondientes.

El método CopyTo utiliza los datos actuales en el rowset. Esto puede ser

diferente de los valores de datos originales si el rowset se recupera de la base de datos y los valores en que se han cambiado ya sea por un

usuario final o un programa de PeopleCode Si se dan pares de nombres de origen y de destino de registro, estos se

utilizan para emparejar los records y subscrolls antes de la comprobación de los campos de registro-con nombre similar. Entonces,

después de copiar los pares de registros con nombre, este método copia todos los registros con nombres idénticos.

Nota: Este método no funciona para los State Records Application Engine. Si no se especifica record_list, tanto el nombre de registro y el

nombre del campo tienen que coincidir exactamente con los datos se copian de un campo de registro a otro. Si especifica record_list, después

de que los registros se han emparejado, los nombres de los campos

tienen que coincidir para que se copian los datos.

Si el rowset que se copia tiene el EditError nivel de campo, así como las propiedades y MessageNumber MessageSetNumber establecidos, estos

valores se copian en el rowset donde está copiando.

Parametros

&DestRowset Especifica el rowset que sera copiado. Este objeto rowset ya debe haber creado una instancia.

SourceRecname Especifica un record para ser copiado, en el objeto

rowset de la copia.

DestRecname Especifique un registro para ser copiado, en el objeto

de rowset que desea copiar.

Retornos: ninguno

Page 8: rowset.pdf

Ejemplo

If you set one rowset equal to another, you haven’t made a copy of the

rowset. Instead, you have two variables pointing to the same data. To make a clone of an existing rowset, that is, to make two distinct

copies, you can do the following: &RS2 = CreateRowset(&RS);

&RS.CopyTo(&RS2); The following example copies data from one rowset object to another.

Because no like-named records exist between the two rowsets, the record names are specified. Only the like-named fields are copied from

one rowset to the other: Local Rowset &RS1, &RS2;

Local String &EMPLID;

&RS1 = CreateRowset(RECORD.PERSONAL_DATA); &RS2 = CreateRowset(RECORD.PER_VENDOR_DATA);

&EMPLID = "8001";

&RS1.Fill("WHERE EMPLID =: 1", &EMPLID); &RS1.CopyTo(&RS2, RECORD.PERSONAL_DATA,

RECORD.PER_VENDOR_DATA); The following example copies data from a message into the Component

buffers, then calls the page (using TransferPage) to redraw the page. You could do this to fill a page with message data that is in error, so

that an end-user can make corrections to the message data. &WRK_ROWSET0 is the level zero rowset and &WRK_ROWSET1 is where

the data is copied to. /* Get the Message */

&MSG = GetSubContractInstance(&PUBID, &PUBNODE, &CHNLNAME, &MSGNAME, &SUBNAME);

/* Get the Message Rowset */

&MSG_ROWSET = &MSG.GetRowset();

/* Get Level 0 */

&WRK_ROWSET0 = GetLevel0();

/* Create Work rowset */ &WRK_ROWSET1 =

GetLevel0()(1).GetRowset(SCROLL.EN_REVISION_TMP);

/* Populate Work Rowset */

Page 9: rowset.pdf

&MSG_ROWSET.CopyTo(&WRK_ROWSET1, RECORD.EN_REVISION,

RECORD.EN_REVISION_TMP);

SetNextPage("EN_REVISION_MSG");

TransferPage();

DeleteRow

Sintaxis

DeleteRow(n)

El metodo DeleteRow borra el row en el rowset identificado por el

parametro. Si el programa se ejecuta desde un componente contra el buffer de

datos de componentes, un evento RowDelete PeopleCode también dispara, seguido por los acontecimientos que normalmente siguen un

RowDelete, como si el usuario hubiera presionado manualmente ALT 8 y ENTER.

Este metodo inicialmente marca el row como necesidad de ser eliminado. A la hora de guardar el row se elimina definitivamente de la

base de datos y borra de la memoria intermedia. Cuando la fila se marca como eliminado, se ignora por otros métodos, como

GetCurrEffRow, Sort, y así sucesivamente.

DeleteRow no puede ser ejecutado en el mismo rowset donde la

eliminación se lleva a cabo, o desde un rowset hijo contra el padre. Coloca el PeopleCode en un rowset padre y ejecutarlo en contra de un

rowset hijo. Cuando se utiliza DeleteRow en un ciclo, tienes que procesar las filas de

arriba hacia abajo para lograr los resultados correctos, es decir, debe eliminar de abajo hacia arriba y no de arriba hacia abajo. Esto es

necesario porque las filas se numeran después de que se eliminen (si se elimina la fila uno, la segunda fila se convierte en la fila uno).

Nota: Si tu usas DeleteRow sobre un rowset creado con la function

CreateRowset, el row no se borra automaticamente en la base de datos cuando la pagina es guardada. Los rowsets creados unsando la función

CreateRowset son rowsets independientes, no están ligadas a la base de datos, así que no hay actualizaciones de bases de datos cuando se

manipulan. Actividades Delete e Insert en estos tipos de rowset no se

aplican automáticamente a la hora de guardar.

Page 10: rowset.pdf

Parametros

n Un entero identifica un row dentro del objeto rowset. Esto debe ser >= 1 y <= el número de filas activas del rowset(ActiveRowCount).

Retornos

Valor booleano opcional: True si se elimina la fila, False en caso contrario.

Ejemplo

En el siguiente ejemplo DeleteRow es usando en un ciclo For, El ejemplo comprueba un valor en cada fila, a continuación, elimina de forma

condicional la fila. Tener en cuenta la sintaxis del ciclo For, incluyendo el uso de -1 en la

cláusula del Paso desde la más alta a valores más bajos. Esto asegura que la nueva numeración de las filas no afectan al ciclo.

For &I = &RS2.ActiveRowCount To 1 Step -1

If None(&CHECK_SEQ) Then

&RS2.DeleteRow(&I);

End-If;

End-For;

Fill

Sintaxis Fill([wherestring [, bindvalue] . . .])

El metodo Fill vacia el rowset entonces lee los registros desde la base de

datos en filas sucesivas. Los registros se leen las tablas de bases de datos correspondientes al

registro de base de datos principal del desplazamiento en ese registro. Los registros se seleccionan por la cláusula wherestring de SQL opcional,

en el que los bindvalues opcionales están sustituidos, usando los marcadores de posición de vinculación habituales (: n).

En genera, este metodo se usa solamente en rowsets que han sido creados usando la function CreateRowset.

Note: Because Flush always leaves one row in the scroll, there will be one row in the scroll even if you don’t read any records.

Page 11: rowset.pdf

The actual number of records read into the rowset is an optional return

of this method. Note: This method does not work with Application Engine state records.

Also, you cannot use this method in dynamic views.

When this method executes, unlike the Select method, it does not cause any associated PeopleCode to run as part of reading data into the

rowset. Note: Fill reads only the primary database record. It does not read any

related records, nor any subordinate rowset records. For every record read with the Fill method, if the set language is not the

base language and the record has related language records, the Fill method tries to read the related language record and does related

language processing. The Fill method uses a correlation ID of FILL for the table it reads. You

must use the correlation ID if you want to refer to the rowset table name as part of the wherestring. You receive a runtime error if you use

the table name as a column prefix instead of the correlation ID. Sorting Considerations

Rows come unsorted from the database when using Fill. This is not a

problem for SQL server, however, it can be a problem for DB2 UDB for OS/390 and z/OS and Oracle.

Parameters

wherestring Specify a SQL WHERE clause to use for selecting records to fill the rowset. This can be a string

or a SQL definition.

bindvalue Specify optional bind variables to be used with the WHERE clause.

Returns

The number of records read into the rowset. Example

The following example reads all of the QA_MYRECORD records into a rowset, and returns the number of rows read:

&RS = CreateRowset(RECORD.QA_MYRECORD); &NUM_READ = &RS.Fill();

The following example reads all of the QA_MYRECORD records that have a MYRECORD field equal to the value of &UVAL into a rowset, and

returns the number of rows read: &NUM_READ = &RS.Fill("where MYRECORD = :1", &UVAL);

To re-use a WHERE clause for the wherestring you can use the SQL repository, and a SQL object.

&NUM_READ = &RS.Fill(SQL.MYWHERE, &UVAL); The following example gets all the SET_CNTRL_REC rows related to the

row on the page, then updates SETID with the value from the page. Fill

is used with a rowset that was created from a message that was just created, that is, a rowset that was unpopulated.

Page 12: rowset.pdf

If FieldChanged(SETID) Then

&MSG = CreateMessage(OPERATION.SET_CNTRL_REC); &MSG_ROWSET = &MSG.GetRowset();

&MSG_ROWSET.Fill("where SETCNTRLVALUE =:1 and REC_GROUP_ID

=:2", SETCNTRLVALUE, REC_GROUP_ID);

For &I = 1 To &MSG_ROWSET.ActiveRowCount &MSG_ROWSET.GetRow(&I).SET_CNTRL_REC.SETID.Value = SETID;

&MSG_ROWSET.GetRow(&I).PSCAMA.AUDIT_ACTN.Value = "C"; End-For;

&MSG.Publish();

End-If;

When using the Fill method, the IsChanged property of each field in a part rowset is not set to true. Because the fields appear to be

unchanged, this can create a problem for publication of data from Message rowsets. A technique to avoid this problem is to create a

second rowset and use the CopyTo method to copy the changes to the

Message rowset as shown in the following example: &a = CreateMessage(Operation.MY_ASYNC);

&rs = &a.GetPartRowset(1);

&trs = CreateRowset(Record.PSPMAGENT); &trs.Fill("where PM_AGENTID >= 12345");

&trs.CopyTo(&rs);

%IntBroker.Publish(&a); The following example uses a correlation ID for the table in the Fill

SELECT, to enable the use of correlated subqueries in the WHERE clause, such as the usual effective-date subquery:

&RSOWNER_NAME = CreateRowset(RECORD.PERSONAL_D00); &RSOWNER_NAME.Fill("where SETID=:1 AND EMPLID=:2 AND

%EffDtCheck(PERSONAL_D00,FILL,:3)", &SETID, &EMPLID, &EFFDT);

The Fill method implicitly uses Fill as an alias for the Rowset record. This is helpful for complex Fill where clauses with subqueries.

&oprclasscountries = CreateRowset(Record.SCRTY_TBL_GBL);

&oprclasscountries.Fill("WHERE FILL.OPRCLASS = :1 AND NOT EXISTS (SELECT 'X' FROM PS_SCRTY_SEC_GBL GBL2 WHERE GBL2.OPRCLASS

= FILL.OPRCLASS AND GBL2.COUNTRY = FILL.COUNTRY AND GBL2.PNLNAME = :2)", &OPRCLASS, %Component);

Page 13: rowset.pdf

In the following example, the necessary key field values are loaded into

a rowset, then the following function is called, and the values are used as part of the Fill method.

Function FillRS2();

Local SQL &MySql;

Local string &MySqlString; Local Record &ElemDefnRec;

Local string &ElemDefnRecName, &fldname; Local Rowset &CompRec2RS;

/* Build the record object that is used for building the SQL and

executing the select */ &ElemDefnRec = CreateRecord(@("Record." | &pkgRecName));

/* Initialize the SQL string */

&MySqlString = "%SelectByKey(:1 A)";

/* Create a SQL to select a rows based on the key fields. */

For &i = 1 To &ElemDefnRec.FieldCount If &ElemDefnRec.GetField(&i).IsKey Then

&fldname = &ElemDefnRec.GetField(&i).Name; &ElemDefnRec.GetField(&i).Value =

&CompRec2RS.GetRow(1).GetRecord(@("Record." | &pkgRecName)).GetField(@("Field." | &fldname)).Value;

End-If; End-For;

/* Create the SQL and execute the select */

&MySql = CreateSQL(&MySqlString); &MySql.Execute(&ElemDefnRec);

/* Copy each selected row into the rowset */

While &MySql.Fetch(&ElemDefnRec)

&ElemDefnRec.CopyFieldsTo(&CompRec2RS(&CompRec2RS.ActiveRowC

ount).GetRecord(1)); End-While;

End-Function;

Page 14: rowset.pdf

Flush

Syntax

Flush()

Description

Utilice el método Flush para eliminar todas las filas del rowset y liberar su memoria

intermedia asociada. Las filas que se vacían no se eliminan de la base de datos. Esta

función se utiliza a menudo para eliminar un desplazamiento de trabajo antes de utilizar el

método Select.

Nota: Vaciar siempre deja una fila en el desplazamiento.

No se puede eliminar el contexto actual del programa en ejecución. Esto significa Flush no

se puede utilizar para el rowset que contiene el programa en ejecución, o en cualquier

rowset hijo y ejecutados contra el rowset padre. Coloca el PeopleCode en un rowset padre y

ejecutarlo en contra de un rowset hijo.

Para los rowset que corresponden a datos del búfer de componentes, el método Flush

ejecuta en modo turbo sólo-es decir, el procesamiento se realiza por defecto, pero sólo en

que se tiran la fila.

Considerations When Initializing New Rows

Flush removes all rows and inserts a row.

If you want to initialize the row, that is, have the defaults and any RowInit PeopleCode run, you must do something to invoke the default value processing. This can be as simple as setting the value of another field on the same page that has a PeopleCode program associated with it.

If the rowset is created from message data, an Application Engine program, and so on, the rows are flushed but the row that is inserted is not initialized.

Considerations for User-Sorted Grids

If a grid has a user personalized sort defined for it and your PeopleCode program flushes that grid and then repopulates it (for instance, through a Fill, a Select, or a series of InsertRow calls), this could invalidate the user's personalized sort and the current row in the user's view unless your PeopleCode program makes arrangements to reapply these user personalizations.

After flushing and repopulating the rowset, your PeopleCode program should re-sort the rowset (that is, re-sort the grid). If the user has a personalized sort, then the user's personalized sort will be reapplied via the PeopleCode sort.

Also, after flushing and repopulating a grid, it will be important to manage which row is deemed the current row. This can be managed using methods such as IsUserSorted, GetFirstUserSortedRow, MapBufRowToUserSortRow, and then by setting the TopRowNumber property accordingly.

See IsUserSorted.

Parameters

None.

Returns

Page 15: rowset.pdf

None.

Example

The following example checks for the value of the field CHECKLIST_CD. If something exists in this field, the second level rowset is flushed and new values are selected into it.

If All(CHECKLIST_CD) Then

&RS1H.Flush();

&RS1H.Select(RECORD.CHECKLIST_ITEM, "where Checklist_CD = :1 and EffDt

= (Select Max(EffDt) from PS_CHECKLIST_ITEM Where CheckList_CD = :2)",

CHECKLIST_CD, CHECKLIST_CD);

End-If;

InsertRow

Syntax

InsertRow(n)

Description

InsertRow

InsertRow realiza mediante programación el ALT 7 y ENTER función (RowInsert). InsertRow inserta una nuevo row del rowset actual después de la fila especificada por el parámetro si el registro principal para el rowset no es eficaz en fecha o un rowset independiente. Si el registro primario para el rowset es efectiva con fecha posterior o de un conjunto de filas independiente, la nueva fila se inserta antes de la fila actual, y todos los valores de la fila actual se copian en la nueva fila, excepto para EFFDT, que se fija a la corriente fecha.

Ademas, InsertRow propaga las llavez de desde e mas alto nivel en los row insertados.

In addition, InsertRow propagates the keys from the higher level (if any) into the inserted row.

If the program is being run from a component against Component buffer data, a RowInit PeopleCode event also fires, followed by the events that normally follow a RowInsert, as if the user had manually pressed ALT+7 and ENTER.

The InsertRow method can be executed against the same rowset where the insertion will take place.

For rowsets corresponding to component buffer data, the InsertRow method executes in turbo mode only—that is, default processing is performed, but only on the row being inserted. Additional information on turbo mode and non-turbo mode is available in the documentation with the InsertRow PeopleCode built-in function.

See InsertRow.

InsertRow cannot be executed from the same rowset where the insertion will take place, or from a child rowset against a parent. Place your PeopleCode in a parent rowset and execute it against a child rowset.

Note: If you use InsertRow on a rowset created using the CreateRowset function, the row isn't automatically inserted in the database when the page is saved. Rowsets created using the CreateRowset function are standalone rowsets, not tied to the database, so there are no database updates when they are manipulated. Delete and insert activity on these types of rowsets aren't automatically applied at save time.

Page 16: rowset.pdf

Effective-Dated Row Considerations

When a row is inserted, if that row contains child scrolls, this method also inserts an empty row for any child scrolls. The effective-date field for this empty row is also empty. The current date is not used.

Parameters

n An integer identifying a row within the rowset object. This must be >= 0 and <= the number of active rows in the rowset (see property ActiveRowCount). A value of 0 inserts in front of the first row.

Returns

An optional Boolean value: True if the row is inserted, False if the row is not inserted.

Example

In the following example, as the primary database record isn’t effective-dated, the new row is inserted after the second row in the rowset.

&ROWSET.InsertRow(2);

HideAllRows

Syntax

HideAllRows()

Description

HideAllRows oculta todos los rows del rowset. Usando este metodo es modificar la propiedad visible de cada row del rowset a False.

HideAllRows hides all rows of the rowset. Using this method is equivalent to a loop setting the visible property of each row of the rowset to False.

Yo no puedes ocultar roes dentro del context del programa que se esta ejecuntando.

You cannot hide rows in the current context of the executing program. This means HideAllRows cannot hide the rowset containing the executing program, or in any child rowsets and be executed against the parent rowset. Place your PeopleCode in a parent rowset and execute it against a child rowset.

Parameters

None.

Returns

None.

Example

The following example hides the second level scroll if a value exists in the NO_COMMENTS field in the first level of the scroll. The code is running from the first level of the scroll.

Local Rowset &RS1, &RS2;

Page 17: rowset.pdf

&RS1 = GetRowset();

&RS2 = GetRowset(SCROLL.EMPL_CHKLST_ITM);

For &I = 1 to &RS1.ActiveRowCount

If ALL(&RS1.GetRow(&I).EMPLOYEE_CHECKLIST.NO_COMMENTS) Then

&RS2.HideAllRows();

End-If;

/*other processing */

End-For;

ShowAllRows

Syntax

ShowAllRows()

Description

ShowAllRows desoculta todas rows del objeto rowset ejecutandose en el metodo. Usando este metodo es equivalente a modificar la propiedad visible de cada row en el rowset a True.

ShowAllRows "unhides" all rows of the rowset object executing the method. Using this method is equivalent to a loop setting the visible property of each row of the rowset to True.

ShowAllRows cannot be executed from the same rowset you want to display, or from a child rowset against a parent. Place your PeopleCode in a parent rowset and execute it against a child rowset.

Parameters

None

Returns

None.

Example

&ROWSET.ShowAllRows();

FlushRow

Syntax

FlushRow(n)

Description

Page 18: rowset.pdf

Use el metodo FlushRow para remover un row en específico del rowset

y del buffer de component. Los Rows flusheados no son borrados de la base de datos.

El Metodo FlushRow es especializado y frecuentemente usado. El

muchas ocaciones, tu puedes usar DeleteRow para remover un row del buffer de componente y remover de la base de dato hasta que el

componente es guardado.

You cannot flush the current context of the executing program. This

means FlushRow cannot be used for the rowset containing the executing program, or in any child rowset and executed against the

parent rowset. Place your PeopleCode in a parent rowset and execute it against a child rowset.

http://docs.oracle.com/cd/E41633_01/pt853pbh1/eng/pt/tpcr/langref_RowsetClassMethods-c07c55.html

ClearDeletesChanges

Sintaxis ClearDeletesChanges()

Use el método ClearDeletesChanges para borrar rows eliminadas y cambiado de rowset independiente.

Nota: este método trabaja solamente con rowsets independientes, es decir, rowsets creados usando la función CreateRowset.

Este método difiere desde Flush en un numero de maneras: no elimina todas las rows del rowset, las rows eliminadas

solamente sólo se aplica a los rowset independientes

Este método primero limpia las rows eliminadas, es decir, todas las rows que han sido eliminadas usando DeleteRow que se eliminen del rowset y

sus buffers asociados son liberados.

Este método a continuación, borra las rows modificadas. Eso significa que los cambios realizados en un row (como valores de campo

modificados) o rows recién insertados ahora se propaga a su estado original y los buffers modificados, en su caso, se liberan.

Después de ejecutar este método en un rowset independiente, cualquier row que antes era nuevo o modificado ya no tiene ese estado. Las

propiedades isNew y IsChanged de una fila devuelven false. Este método no hace las actualizaciones de base de datos.

¿Cómo utilizar este método? Suponga que utiliza un rowset independiente para rastrear los cambios que necesita hacer a algún

proceso de negocio o un objeto. Después de hacer las actualizaciones de

Page 19: rowset.pdf

las bases de datos apropiadas para reflejar los cambios registrados en el

rowset (es decir, inserciones o eliminaciones o cambios), se llama a este método para limpiar el rowset en preparación para su posterior

procesamiento. Sin este método, los rows recién insertadas y filas

modificadas conservan su estado IsNew y IsChanged indefinidamente, lo que complica la lógica del programa y que puede conducir a duplicar las

inserciones o eliminaciones. Parámetros: ninguno

Retornos: ninguno Ejemplo REM +--------------------------------------------------+;

REM | Function to Update the DB for a Standalone Rowset|;

REM +--------------------------------------------------+;

Function ProcessDatabaseUpdateforRowset(&rsIn As Rowset)

For &i = 1 To &rsIn.RowCount

&rwTMP = &rsIn.GetRow(&i);

If &rwIn.IsDeleted And

Not &rwIn.IsNew Then

&rTMP = &rwIn.GetRecord(1);

&rTMP.Delete();

End-If;

If &rwTMP.IsNew And

&rwTMP.IsChanged And

Not &rwTMP.IsDeleted Then

&rTMP = &rwTMP.GetRecord(1);

&rTMP.Insert()

End-If;

If Not &rwTMP.IsNew And

&rwTMP.IsChanged And

Not &rwTMP.IsDeleted Then

&rTMP = &rwTMP.GetRecord(1);

&rTMP.Update();

End-If;

End-For;

REM +-----------------------------------------------+;

REM | Now we need to reset the Rowset flags and |;

REM | remove deleted rows |;

REM +-----------------------------------------------+;

&rsIn.ClearDeletesChanges();

Page 20: rowset.pdf

End-Function;