ERROR EN CONSULTA SQL DESDE APLICACION FWH
Posted: Thu Jun 27, 2013 8:54 pm
Saludos Antonio y demas miembros del foro de FWH,
Estoy solicitando ayuda para solucionar un error en una aplicacion elaborada en FWH que realiza una consulta a SQL Server para extraer informacion. (Tengo imagen del error pero no se como adjuntarla en esta nota)... esta misma consulta en el SQL SERVER 2005 funciona perfecto y genera una consulta de 5 columnas.
En el error sale un dialogo que tiene como titulo FiveODBC error message..., el texto de la consulta y luego [#0] Class: 01S02, [Microsoft][ODBC SQL Server Driver]Cambió el tipo de cursor, On Procedure: MAIN Line: 0
Mis consultas...
1. Como inserto una imagen o archivo de texto en esta nota para que la puedan ver..
2. Asumo que el error es porque dentro de esa consulta abro varias tablas... porque consultando 1 sola funciona bien... tendria que crear varias conexiones oDbf1....3 para cada tabla de la base de datos y luego en FWH hacer las relaciones..?
3. Que objeto debo usar para convertir esa consulta en un archivo de texto separado por comas?
4. Que objeto debo usar para subir ese archivo a un ftp?
5. Que objeto debo usar para enviar un correo de constancia del envio?
El proyecto es automatizar un proceso en el que extraigo unos datos de sql server, los convierto con excel en un .CSV, edito y le pongo unos comandos de MYSQL para actualizar, quitarle comillas, etc.. entro al administrador de MYSQL en nuestro servidor (powweb.com) y ejecuto ese archivo.. esto me actualiza los precios en linea y cantidades..
Agradezco de antemano la atencion y colaboracion.
Este es el codigo.
#include "FiveWin.ch"
#include "sql.ch"
MEMVAR oSysList
PROC Main()
LOCA oOdbc, oDbf, aData:= {}
oOdbc := TOdbc():New( OdbcDsnEntries()[ 5 ], 'sa', 'B1Admin' )
IF oOdbc:lSuccess
oDbf := TDbOdbc():new( "SELECT T0.[ItemCode][PRODUCTS_MODEL], T0.[ItemName][PRODUCTS_NAME], T0.[SuppCatNum][REF], T3.[FirmName][MARCA], " + ;
" SUM(T1.[OnHand])[EN STOCK], " + ;
" ( SELECT CASE WHEN ( T0.[ItemCode] IN ( SELECT CatSN.[ItemCode] FROM OSCN CatSN " + ;
" WHERE CatSN.[CardCode] = ( SELECT ItemInfo.[CardCode] FROM OITM ItemInfo " + ;
" WHERE T0.[ItemCode] = ItemInfo.[ItemCode]) AND CatSN.[U_HO_VENTA_SN] > 0) ) " + ;
" THEN ( SELECT MAX(CatSN.[U_HO_VENTA_SN]) FROM OSCN CatSN " + ;
" WHERE T0.[ItemCode] = CatSN.[ItemCode] AND CatSN.[CardCode] = " + ;
" ( SELECT ItemInfo.[CardCode] FROM OITM ItemInfo WHERE T0.[ItemCode] = ItemInfo.[ItemCode] ) ) " + ;
" WHEN ( ( SELECT MAX(LP.[AvgPrice]) FROM OITW LP WHERE T0.[ItemCode] = LP.[ItemCode] ) > 1 ) " + ;
" THEN ( SELECT MAX(LP.[AvgPrice]) FROM OITW LP WHERE T0.[ItemCode] = LP.[ItemCode] ) * 1.67 " + ;
" WHEN ( ( SELECT MAX(LP.[AvgPrice]) FROM OITW LP WHERE T0.[ItemCode] = LP.[ItemCode] ) <= 1 ) " + ;
" THEN ( SELECT LP2.[U_HO_COSTO] FROM OITM LP2 WHERE T0.[ItemCode] = LP2.[ItemCode] ) * 1.67 " + ;
" END )[VTA] " + ;
"FROM OITM T0 INNER JOIN OITW T1 ON T0.ItemCode = T1.ItemCode " + ;
" INNER JOIN OITB T2 ON T0.ItmsGrpCod = T2.ItmsGrpCod " + ;
" INNER JOIN OMRC T3 ON T0.FirmCode = T3.FirmCode " + ;
"WHERE T1.[WhsCode] IN ('001', '002', '003', '004', '006', '007', '008', '009', '010') AND T0.[QryGroup58] = 'Y' " + ;
"GROUP BY T0.[ItemCode], T0.[ItemName], T0.[SuppCatNum], T3.[FirmName], T0.[AvgPrice] " + ;
"ORDER BY T0.[ItemCode]", oOdbc )
IF ! oOdbc:IsError()
oDbf:Gotop()
WHIL ! oDbf:Eof()
AADD( aData, oDbf:FieldGet( 1 ) )
oDbf:Skip()
ENDD
MSGINFO( aData[ 1 ] + ' ' + oDbf:FieldName( 1 ) )
oDbf:End()
oOdbc:End()
ELSE
oOdbc:ShowErrorList( 'Error al ejecutar consulta' )
oOdbc:aErrors := {}
oDbf:End()
ENDI
ELSE
oOdbc:ShowErrorList( 'Error al iniciar sesion ODBC' )
oOdbc:End()
ENDI
RETU
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* Start()
*
***/
INIT PROC Start( cParameter1 )
PUBL oSysList:= TSysList():New()
SET( _SET_CANCEL , .F. )
SET( _SET_DATEFORMAT, 'dd/mm/yy' )
SET( _SET_DECIMALS , 2 )
SET( _SET_DELETED , .T. )
SET( _SET_EPOCH , 1990 )
SET( _SET_EXACT , .T. )
SET( _SET_FIXED , .T. )
RETU
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* Exit()
*
***/
EXIT PROC EXIT()
RETU
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* TSysList
*
* Clase TSysList que contiene informacion del sistema.
*
***/
CLASS TSysList
DATA PathApp, Cargo
METHOD New() CONSTRUCTOR
ENDCLASS
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* ::New() --> Self
*
***/
METHOD New() CLASS TSysList
::PathApp:= HB_CURDRIVE() + ':\' + CURDIR()
::Cargo := ''
RETU SELF
Estoy solicitando ayuda para solucionar un error en una aplicacion elaborada en FWH que realiza una consulta a SQL Server para extraer informacion. (Tengo imagen del error pero no se como adjuntarla en esta nota)... esta misma consulta en el SQL SERVER 2005 funciona perfecto y genera una consulta de 5 columnas.
En el error sale un dialogo que tiene como titulo FiveODBC error message..., el texto de la consulta y luego [#0] Class: 01S02, [Microsoft][ODBC SQL Server Driver]Cambió el tipo de cursor, On Procedure: MAIN Line: 0
Mis consultas...
1. Como inserto una imagen o archivo de texto en esta nota para que la puedan ver..
2. Asumo que el error es porque dentro de esa consulta abro varias tablas... porque consultando 1 sola funciona bien... tendria que crear varias conexiones oDbf1....3 para cada tabla de la base de datos y luego en FWH hacer las relaciones..?
3. Que objeto debo usar para convertir esa consulta en un archivo de texto separado por comas?
4. Que objeto debo usar para subir ese archivo a un ftp?
5. Que objeto debo usar para enviar un correo de constancia del envio?
El proyecto es automatizar un proceso en el que extraigo unos datos de sql server, los convierto con excel en un .CSV, edito y le pongo unos comandos de MYSQL para actualizar, quitarle comillas, etc.. entro al administrador de MYSQL en nuestro servidor (powweb.com) y ejecuto ese archivo.. esto me actualiza los precios en linea y cantidades..
Agradezco de antemano la atencion y colaboracion.
Este es el codigo.
#include "FiveWin.ch"
#include "sql.ch"
MEMVAR oSysList
PROC Main()
LOCA oOdbc, oDbf, aData:= {}
oOdbc := TOdbc():New( OdbcDsnEntries()[ 5 ], 'sa', 'B1Admin' )
IF oOdbc:lSuccess
oDbf := TDbOdbc():new( "SELECT T0.[ItemCode][PRODUCTS_MODEL], T0.[ItemName][PRODUCTS_NAME], T0.[SuppCatNum][REF], T3.[FirmName][MARCA], " + ;
" SUM(T1.[OnHand])[EN STOCK], " + ;
" ( SELECT CASE WHEN ( T0.[ItemCode] IN ( SELECT CatSN.[ItemCode] FROM OSCN CatSN " + ;
" WHERE CatSN.[CardCode] = ( SELECT ItemInfo.[CardCode] FROM OITM ItemInfo " + ;
" WHERE T0.[ItemCode] = ItemInfo.[ItemCode]) AND CatSN.[U_HO_VENTA_SN] > 0) ) " + ;
" THEN ( SELECT MAX(CatSN.[U_HO_VENTA_SN]) FROM OSCN CatSN " + ;
" WHERE T0.[ItemCode] = CatSN.[ItemCode] AND CatSN.[CardCode] = " + ;
" ( SELECT ItemInfo.[CardCode] FROM OITM ItemInfo WHERE T0.[ItemCode] = ItemInfo.[ItemCode] ) ) " + ;
" WHEN ( ( SELECT MAX(LP.[AvgPrice]) FROM OITW LP WHERE T0.[ItemCode] = LP.[ItemCode] ) > 1 ) " + ;
" THEN ( SELECT MAX(LP.[AvgPrice]) FROM OITW LP WHERE T0.[ItemCode] = LP.[ItemCode] ) * 1.67 " + ;
" WHEN ( ( SELECT MAX(LP.[AvgPrice]) FROM OITW LP WHERE T0.[ItemCode] = LP.[ItemCode] ) <= 1 ) " + ;
" THEN ( SELECT LP2.[U_HO_COSTO] FROM OITM LP2 WHERE T0.[ItemCode] = LP2.[ItemCode] ) * 1.67 " + ;
" END )[VTA] " + ;
"FROM OITM T0 INNER JOIN OITW T1 ON T0.ItemCode = T1.ItemCode " + ;
" INNER JOIN OITB T2 ON T0.ItmsGrpCod = T2.ItmsGrpCod " + ;
" INNER JOIN OMRC T3 ON T0.FirmCode = T3.FirmCode " + ;
"WHERE T1.[WhsCode] IN ('001', '002', '003', '004', '006', '007', '008', '009', '010') AND T0.[QryGroup58] = 'Y' " + ;
"GROUP BY T0.[ItemCode], T0.[ItemName], T0.[SuppCatNum], T3.[FirmName], T0.[AvgPrice] " + ;
"ORDER BY T0.[ItemCode]", oOdbc )
IF ! oOdbc:IsError()
oDbf:Gotop()
WHIL ! oDbf:Eof()
AADD( aData, oDbf:FieldGet( 1 ) )
oDbf:Skip()
ENDD
MSGINFO( aData[ 1 ] + ' ' + oDbf:FieldName( 1 ) )
oDbf:End()
oOdbc:End()
ELSE
oOdbc:ShowErrorList( 'Error al ejecutar consulta' )
oOdbc:aErrors := {}
oDbf:End()
ENDI
ELSE
oOdbc:ShowErrorList( 'Error al iniciar sesion ODBC' )
oOdbc:End()
ENDI
RETU
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* Start()
*
***/
INIT PROC Start( cParameter1 )
PUBL oSysList:= TSysList():New()
SET( _SET_CANCEL , .F. )
SET( _SET_DATEFORMAT, 'dd/mm/yy' )
SET( _SET_DECIMALS , 2 )
SET( _SET_DELETED , .T. )
SET( _SET_EPOCH , 1990 )
SET( _SET_EXACT , .T. )
SET( _SET_FIXED , .T. )
RETU
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* Exit()
*
***/
EXIT PROC EXIT()
RETU
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* TSysList
*
* Clase TSysList que contiene informacion del sistema.
*
***/
CLASS TSysList
DATA PathApp, Cargo
METHOD New() CONSTRUCTOR
ENDCLASS
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*
* ::New() --> Self
*
***/
METHOD New() CLASS TSysList
::PathApp:= HB_CURDRIVE() + ':\' + CURDIR()
::Cargo := ''
RETU SELF