- Code: Select all Expand view
FUNCTION Diferidos_ValidarPrestamo()
LOCAL lOk := FALSE
LOCAL cSql := ""
IF Empty( cNumPre )
MsgAlert( "No introdujo el numero de prestamo.", "Verifique" )
ELSE
cNumPre := FillZero( cNumPre, 6 )
oDlgE:update()
cSql := "SELECT PRE.NUM_PRES, PRE.NUM_CLIE, PRE.PAGADO, CLI.NOMBRE, CLI.CEDULA, CLI.SALDO_ACT, CLI.NUM_RUTA, RUT.NOMBRE AS NOM_RUTA " + ;
"FROM PRESTAMOS AS PRE, CLIENTES AS CLI, RUTAS AS RUT " + ;
"WHERE PRE.NUM_PRES = %1 AND PRE.PAGADO = FALSE AND PRE.NUM_CLIE = CLI.NUM_CLIE AND CLI.NUM_RUTA = RUT.NUM_RUTA"
IF ADSRunSQL( "TEMP", cSql, { cNumPre } )
cNumCli := TEMP->NUM_CLIE
cNomCli := TEMP->NOMBRE
cCedCli := TEMP->CEDULA
cNumRut := TEMP->NUM_RUTA
cNomRut := TEMP->NOM_RUTA
nSalCli := TEMP->SALDO_ACT
IF TEMP->( Eof() )
MsgAlert( "El numero del prestamo indicado no fue encontrado!", "Verifique" )
ELSE
lOk := TRUE
oDlgE:aControls[1]:oJump := oDlgE:aControls[8]
ENDIF
TEMP->( DBCloseArea() )
ENDIF
oDlgE:update()
ENDIF
RETURN lOk
anteriormente tenia que realizar dos busquedas a dos tablas diferentes para tomar los datos, pero ahora con una instruccion sql queda directa, a proposito estoy usando una funcion derivada de otra que encontre por algun lado, la pongo aca por si les gustaria experimentar:
- Code: Select all Expand view
FUNCTION ADSRunSQL( cAlias, cSql, aParameters, hConnection, lShow )
LOCAL cOldAlias := Alias()
LOCAL lCreate := FALSE
LOCAL nItem := 0
LOCAL xParameter
DEFAULT hConnection := hConn
DEFAULT lShow := FALSE
IF !Empty( cAlias ) .and. !Empty( cSql )
cSql := StrTran( cSql, ";", "" )
DBSelectArea( 0 )
IF !AdsCreateSqlStatement( cAlias, ADS_CDX, hConnection )
MsgAlert( "Error AdsCreateSqlStatement()" + FINL + "Error: " + cValtoChar( AdsGetLastError() ) )
ELSE
IF !HB_IsNil( aParameters ) .and. HB_IsArray( aParameters )
FOR EACH xParameter IN aParameters
nItem := HB_EnumIndex()
cSql := StrTran( cSql, "%" + AllTrim( Str( nItem ) ) , Var2Str( xParameter ) )
NEXT
ENDIF
IF lShow
MsgInfo( cSql, "SQLDebug")
ENDIF
IF !AdsExecuteSqlDirect( cSql )
( cAlias )->( DBCloseArea() )
MsgAlert( "Error AdsExecuteSqlDirect( cSql )" + FINL + "Error:" + cValtoChar( AdsGetLastError() ) + FINL + cSql )
ELSE
lCreate := TRUE
ENDIF
ENDIF
IF !Empty( cOldAlias )
DBSelectArea( cOldAlias )
ENDIF
ENDIF
RETURN lCreate
- Code: Select all Expand view
FUNCTION Var2Str( xValue )
LOCAL cType := ValType( xValue )
LOCAL cValue := "''"
DO CASE
CASE cType == "C"
cValue := "'" + xValue + "'"
CASE cType == "N"
cValue := AllTrim( CStr( xValue ) )
CASE cType == "L"
cValue := IIf( xValue, 'True', 'False' )
CASE cType == "D"
cValue := "'" + DToC( xValue ) + "'"
ENDCASE
RETURN cValue
OJO: esta muy inclinada a usar xharbour, pero es facilmente portada a harbour.
el parametro aParameters en la funcion ADSRunSQL es una arreglo con los valores a ser reeplazados en la cadena del parametro cSql en los lugares donde se encuentren %1, %2, ...%n.
por ejemplo
cSql := "select * from clientes where numero=%1 and fecha=%2 and activo=%3"
cNumero := "001"
dFecha := date()
lActivo := .f.
if ADSSql( "TEMP", cSql, { cNumero, dFecha, lActivo }, ....
....
salu2
carlos vargas