Page 1 of 1

ERROR EN CONSULTA SQL DESDE APLICACION FWH

Posted: Thu Jun 27, 2013 8:54 pm
by fusion
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

Re: ERROR EN CONSULTA SQL DESDE APLICACION FWH

Posted: Fri Jun 28, 2013 10:29 pm
by cmsoft
Podrias probar con ADO, haciendo algo así y ver si funciona:

Code: Select all

FUNCTION Main()
LOCAL cConnStr, oCn, oERR, oQry, cSql
cConnStr := 'Provider=MSDAORA.1;Data Source=dblocal;User ID=mulyadi;Password=1234' // Aca pondrias tu cadena de conexion a SQL Server

oCn := CREATEOBJECT( "ADODB.Connection" )
TRY
    oCn:Open( cConnStr )
CATCH oERR
   SAYING := "Error conectando con la base de datos"
   MsgInfo( oErr:description)
   RETURN(.F.)
END TRY

cSql :=  "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]"
 
Try
   oQry := oCn:Execute(cSql)
Catch
   oCn:Close()   
   MsgInfo( "Error en consulta" )
   RETURN(.F.)
End Try
xBrowse( oQry)
oCn:Close()
RETURN .f.
Para saber cual es la cadena de conexión de tu base, puedes usar un truquito que puso The Full
http://forums.fivetechsupport.com/viewt ... na#p105705
Espero te sirva!

Re: ERROR EN CONSULTA SQL DESDE APLICACION FWH

Posted: Thu Aug 01, 2013 9:10 pm
by fusion
muchas gracias cmsoft....

disculpas por la demora en los agradecimientos, tu respuesta fue de gran ayuda, vi la situacion desde otro punto de vista y esta funcionando perfecto...

Termine usando la clase TOleAuto().

Nuevamente agradezco tu colaboracion. :D

Re: ERROR EN CONSULTA SQL DESDE APLICACION FWH

Posted: Thu Aug 01, 2013 11:15 pm
by cmsoft
Me alegro Jair, haberte podido ser útil, y que hayas encontrado la solución. :D