API C/Ideafix para manejo de cursores Postgres SQL

De Master Solutions Wiki
Saltar a: navegación, buscar

Contenido

Cursores SQL

CreateSQLCursor

Crea un cursor.

CreateSQLCursor crea un cursor en base a la sentencia SQL que recibe como argumento, conectándose al esquema ingresado. El esquema debe haberse definido para trabajar en modo SQL (no Ideafix/Essentia), pero la consulta no tiene porque estar restringida a este esquema solamente. No se pueden combinar esquemas que no estén en modo SQL. La consulta puede ser paramétrica, y en caso de serlo se deben indicar el numero de parámetros en el tercer argumento (argsCount)

Sintaxis

 sqlcursor CreateSQLCursor(schema sch, char *sentence, int argsCount);

Parametros

  • schema es el esquema sobre el cual se quiere hacer la consulta.
  • sentence es la consulta SQL.
  • argsCount es la cantidad de parámetros que tiene la consulta.

Valor Retornado

Si se produce un error, CreateSQLCursor devuelve ERROR; sino, devuelve el descriptor del cursor creado.

DeleteSQLCursor

Borra un cursor.

DeleteSQLCursor borra un cursor creado con CreateSQLCursor.

Sintaxis

 void DeleteSQLCursor(sqlcursor cursor);

Paramátros

cursor es el cursor creado con CreateSQLCursor.

AddSQLCursorParameter

AddSQLCursorParameter describe el tipo de los parametros que la consulta recibe. Sólo debe usarse si la consulta está preparada para recibir parámetros.

Sintaxis

 void AddSQLCursorParameter(sqlcursor cur, type ty, UShort len, UShort ndec);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.
  • ty es el tipo de dato del parámetro correspondiente.
  • len es la longitud del tipo de dato.
  • ndec es la cantidad de decimales del parámetro, si el parámetro es numérico con decimales.

ty debe ser alguno de estos valores:

  • TY_NUMERIC para valores numéricos enteros o con decimales.
  • TY_FLOAT para valores de punto flotante.
  • TY_STRING para valores alfanuméricos.
  • TY_DATE para valores de fecha.
  • TY_TIME para valores de hora.
  • TY_BOOL para valores lógicos.

SetSQLCursorParameter

SetSQLCursorParameter define el valor como cadena de caracteres del n-esimo parametro de la consulta SQL.

Sintaxis

 void SetSQLCursorParameter(sqlcursor cur, int fldIndex, char *value);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.
  • fldIndex indica el orden (primero, segundo, etc) de parámetro; el primero debe ser cero.
  • value es el valor del parámetro.

SetSQLCursorParameters

SetSQLCursorParameters define los valores para los parametros de la consulta SQL en un sólo paso.

Sintaxis

 void SetSQLCursorParameters(sqlcursor cur, ...);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.
  • tantos parámetros como la cantidad definida en CreateSQLCursor.

AddSQLFieldTarget

AddSQLFieldTarget permite asociar una columna del resultado de un cursor SQL con un campo de un buffer CFIX.

Esto permite que después se pueda realizar cualquier operación valida sobre buffers CFIX con el resultado de las operaciones del cursor (Ej: DbToFm). Esta sentencia debe ser ejecutada antes del primer Fetch.

Una columna del resultado de una consulta puede estar mapeada solamente a un descriptor de campo CFIX. De repetirse el mapeo, quedará el último como válido.

Sintaxis

 void AddSQLFieldTarget(sqlcursor cur, UShort fldIndex, dbfield fld [, int pos]);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.
  • fldIndex es la posición de la columna en la consulta SQL. La primer posición es cero.
  • fld es el descriptor de campo CFIX al cual queremos asociar con una columna de la consulta SQL.
  • pos se usa para campos vectorizados (no olvidar que se comienza desde cero); indica que posición del campo vectorizado se quiere mapear. Este parámetro es opcional.

SetSQLLevel

SetSQLLevel permite la definicion de cortes de control por tabla en la recorrida de la consulta.

Sintaxis

 void SetSQLLevel(sqlcursor cur, int level, dbtable tab);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.
  • level es el nivel de corte de control.
  • tab es el descriptor de tabla CFIX al cual se asocia level.

FetchSQLNext

FetchSQLNext avanza al siguiente registro de la consulta SQL.

Sintaxis

 int FetchSQLNext(sqlcursor cur);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.

Valor Retornado

Si ocurre un error, FetchSQLNext retorna ERROR; sino, retorna OK.

FetchSQLLevel

Esta función permite la modificación de un código CFIX con cursores anidados a un cursor SQL muy rápidamente. La idea es asociar la noción de cortes de control dentro de la consulta SQL a los cambios de datos según las tablas de la consulta.

Para que esta noción pueda ser valida, se deben haber realizado los mapeos de las columnas de la consulta a los campos de las tablas. FetchSQLLevel accede a registros de la consulta mientras no cambien datos asociados a niveles menores al especificado como segundo argumento.

Sólo se debe usar si se ha especificado algún nivel de corte con la función SetSQLLevel.

Sintaxis

 int FetchSQLLevel(sqlcursor cur, int level);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.
  • level es el nivel de corte.

Valor Retornado

Si ocurre un error, FetchSQLNext retorna ERROR; sino, retorna OK.

Acceso a los datos de la consulta

Para acceder a los datos de la consulta SQL se deben utilizar las funciones GetSQL?Fld. Las funciones GetSQL?Fld permiten el acceso al resultado de una consulta SQL después de haber ejecutado un Fetch.

Sintaxis

 int GetSQLIFld(sqlcursor cur, UShort fldIndex);
 
 long GetSQLLFld(sqlcursor cur, UShort fldIndex);
 
 char *GetSQLSFld(sqlcursor cur, UShort fldIndex);
 
 double GetSQLFFld(sqlcursor cur, UShort fldIndex);
 
 DATE GetSQLDFld(sqlcursor cur, UShort fldIndex);
 
 TIME GetSQLTFld(sqlcursor cur, UShort fldIndex);
 
 NUM GetSQLNFld(sqlcursor cur, UShort fldIndex);

Parámetros

  • cur es el cursor creado con CreateSQLCursor.
  • fldIndex es la posición de la columna en la consulta SQL.

Valor Retornado

Retorna el valor de la columna solicitada.


RestartSQLCursor

RestartSQLCursor permite recomenzar la recorrida que la consulta especificada define.

Sintaxis

 void RestartSQLCursor(sqlcursor cur);

ExecuteSQL

ExecuteSQL permite ejecutar una sentencia SQL que no sea un select. Es decir, permite hacer un update, un insert o un delete. El cursor SQL se debe crear con una de esas sentencias, ejecutar y eliminar inmediatamente, por lo menos en el caso del insert y del delete, pues de ejecutarse más de una vez una de estas ocurrirá un error en el motor SQL.

Sintaxis

 int ExecuteSQL(sqlcursor cur);

Valor retornado

Si la ejecución de la consulta se realizó sin inconvenientes devuelve OK, sino devuelve ERROR.

Ejemplo de cursores anidados

 sqlcursor cur;
 int       nordenes = 0, qrengs;
 double    saldo;
 schema    demo = OpenSchema(“demo”, IO_EABORT);
 
 char      *sqlquery = "select \"ORDENES\".\"ORDERNO", \"FECHA\", \"CLIENO\", \"VALOR\", \"MOVIM\".\"ORDERNO\", \"ITEMNOº", \"CANTID\", \"TOTAL\" 
                        from  \"ORDENES\", \"MOVIM\" 
                        where \"ORDENES\".\"ORDERNO\" = \"MOVIM\".\"ORDERNO\";
  
 cur = CreateSQLCursor(demo, sqlquery, 0);
 
 AddSQLFieldTarget(cur, 0, ORDENES_ORDERNO);
 AddSQLFieldTarget(cur, 1, ORDENES_FECHA);
 AddSQLFieldTarget(cur, 2, ORDENES_CLIENO);
 AddSQLFieldTarget(cur, 3, ORDENES_VALOR);
 AddSQLFieldTarget(cur, 4, MOVIM_ORDERNO);
 AddSQLFieldTarget(cur, 5, MOVIM_ITEMNO);
 AddSQLFieldTarget(cur, 6, MOVIM_CANTID);
 AddSQLFieldTarget(cur, 7, MOVIM_TOTAL);
 SetSQLLevel(cur, 0, ORDENES);
 SetSQLLevel(cur, 1, MOVIM);
 
 while (FetchSQLLevel(cur, 0) != ERROR) 
 {
   nordenes++;
   qrengs = 0;
   saldo  = 0;
 
   // Este ciclo se hará mientras los campos de la tabla ORDENES no cambien su valor
   while ( FetchSQLLevel(cur, 1) != ERROR) 
   {
     qrengs++;
     saldo = saldo + FFld(MOVIM_TOTAL);
   }
 
   if (saldo != FFld(ORDENES_VALOR)) 
   {
     Warning("Inconsitencia en los renglones");
   }
 }
 DeleteSQLCursor(cur);
Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas
Procedimientos
Procesos
Indicadores
Items de Configuración
Imprimir/exportar