//
// Test oRs Not refreshing in Access
//
//---------------------
#include "FiveWin.ch"
#include "xbrowse.ch"
#include "report.ch"
#include "dbstruct.ch"
#include "adodef.ch"
STATIC oCn, cStr
STATIC oRsUser, oRdbms // RecordSet
REQUEST HB_Lang_ES
REQUEST HB_CODEPAGE_ESWIN
//--------------------------------------------------------------------------//
// ---------------------------------------------------------------------------
FUNCTION MAIN()
// ---------------------------------------------------------------------------
// Idioma español para Harbour--------------------------------------------
HB_LangSelect("ESWIN") // Para mensajes, fechas, etc..
HB_CDPSELECT("ESWIN") // Para ordenación, requiere CodePage.lib
// Sets generales---------------------------------------------------------
SetGetColorFocus() // Cambiar el foco del GET
SET EPOCH TO 1990 // Admite los años desde el 1990 en adelante
SET CENTURY ON // 4 dígitos año
SET DATE ITALIAN // formato dd-mm-yyyy
SET DELETED ON // Impedir ver registros marcados borrar
SetCancel( .F. ) // Inutiliza ALT + C para abortar programa
SetDialogEsc( .F. ) // Impide salir Diálogos con Escape
SET( _SET_INSERT, .T. ) // Activa modo Insert
XBrNumFormat( "E", .t. ) // Picture xBrowse formato Europeo decimales
SetBalloon( .T. ) // Balloon shape required for tooltips
ado_string()
VerApuntes()
QUIT
RETURN NIL
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// Función ....: VerApuntes
// Descripción.: Browse en pantalla de los apuntes
// Desde l se llaman las opciones de edici¢n, etc
// ---------------------------------------------------------------------------
FUNCTION VerApuntes()
LOCAL oDlg, oBrowse
LOCAL oBtn1, oBtn2, oBtn3, oBtn4, oBtn5, oBtn6
LOCAL oRs
LOCAL nPos := 0
//
// RecordSet
//-----------
oRs := ado_AbreRecordSet( "select * from APUNTES order by FECHA ASC" )
IF oRs = nil
RETURN NIL
ENDIF
//
// Caja de Diálogo -----------------------------------------------------
DEFINE DIALOG oDlg RESOURCE "APUNTES" ;
TITLE "Mantenimiento de los APUNTES contables"
REDEFINE XBROWSE oBrowse ID 101 OF oDlg ;
DATASOURCE oRs ;
COLUMNS "FECHA", "CUENTA", "APUNTE", "NINGRESO", "NGASTO", "NOTAS" ;
HEADERS "Fecha", "Cuenta", "Apunte", "Ingreso", "Gasto", "Observaciones" ;
AUTOCOLS AUTOSORT CELL LINES
// Estilo-----------
oBrowse:nMarqueeStyle := 5 //9 // 5 por defecto MARQSTYLE_IDESOFT
oBrowse:nHeaderLines := 1.5
oBrowse:nStretchCol := STRETCHCOL_LAST
oBrowse:lAllowColHiding := .F. // Impedir tocar columnas
oBrowse:blDblClick := { || ( oBtn3:Click() ) }
oBrowse:bKeyDown := { | nKey, nFlags | IF (nKey==VK_RETURN, oDlg:End(), ),;
IF (nKey==VK_ESCAPE, oDlg:End(), ) }
REDEFINE BUTTON oBtn1 ID 711 OF oDlg ;
ACTION( AltasApuntes( .T. ), ;
oRs:Requery(), xbrowse(oRs), oBrowse:Refresh(), oBrowse:SetFocus() )
REDEFINE BUTTON oBtn2 ID 712 OF oDlg ;
ACTION( ado_Borrar( oRs ), ;
oBrowse:Refresh() )
REDEFINE BUTTON oBtn3 ID 713 OF oDlg ;
ACTION( nPos := oRs:AbsolutePosition, AltasApuntes( .F., oRs:AbsolutePosition ), ;
oRs:Requery(), oRs:AbsolutePosition := nPos, oBrowse:Refresh() )
REDEFINE BUTTON oBtn4 ID 714 OF oDlg ;
ACTION( oRs:Requery(), oBrowse:Refresh() )
REDEFINE BUTTON oBtn5 ID 715 OF oDlg ;
ACTION( oBrowse:Report("Apuntes´s list"), oBrowse:Refresh() )
REDEFINE BUTTON oBtn6 ID 716 OF oDlg ACTION( oDlg:End() )
ACTIVATE DIALOG oDlg CENTERED ON INIT oBrowse:SetFocus()
ado_CierraRecordSet( @oRs )
RETURN NIL
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// Función ....: AltasApuntes
// Descripción : A¤adimos un registro a la base de datos.
// Variables ..: lLogico -> valor l¢gico, para no duplicar c¢digos.
// nCodigo -> para comprobar c¢digos mediante b£squeda.
// Notas ......: Comprobamos que el c¢digo introducido sea uno de nuevo.
// ---------------------------------------------------------------------------
FUNCTION AltasApuntes( lAppend, nRegistro )
LOCAL oDlg // Objeto Diálogo
LOCAL oRs, oData, oError
LOCAL lSave := .F. // Grabado
DEFAULT lAppend := .F. // Añadir
//
// Seleccionamos RecordSet
//-------------------------
oRs := ado_AbreRecordSet( "select * from APUNTES order by FECHA ASC" )
IF oRs = nil
RETURN NIL
ENDIF
IF lAppend // Si hay que añadir
oData := TDataRow():New( oRs, nil, .t. )
oData:Fecha := Date()
oData:Apunte := "test sample in SUNDAY "+cvalToChar(datetime())
oData:nIngreso := nrandom(10)
ENDIF
oData:Save()
alert("added new record"+CRLF+CRLF+oData:Apunte)
ado_CierraRecordSet( @oRs )
RETURN NIL
// ---------------------------------------------------------------------------
//----------------------------------------------------------------------------//
FUNCTION ado_String()
//----------------------------------------------------------------------------//
LOCAL cMotor := "MSACCESS"
LOCAL cBD := HB_DIRBASE()+"ACCESS.MDB"
DO CASE
CASE cMotor == "MSACCESS"
cStr := 'Provider='+"Microsoft.Jet.OLEDB.4.0"+';Data Source='+cBD
CASE cMotor == "MYSQL"
cStr := "Driver={MySQL ODBC 3.51 Driver};Server=dolphintest.sitasoft.net;" + ;
"Database=dolphin_man;User=test_dolphin;Password=123456;Option=3;"
ENDCASE
RETURN cStr
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//
// FUNCIONES PARA EL MANEJO DE RECORDSET
// -------------------------------------
//
//
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
FUNCTION ado_AbreRecordSet( cSQL )
//----------------------------------------------------------------------------//
LOCAL oError
DEFAULT cSQL := "SELECT * From TablaInexistente"
// open a recordset on demand with sql statement and connection string
oRsUser := TOleAuto():New( "ADODB.Recordset" )
oRsUser:CursorType := 1 // opendkeyset
oRsUser:CursorLocation := 3 // local cache
oRsUser:LockType := 3 // lockoportunistic
TRY
oRsUser:Open( cSQL, cStr )
oCn := oRsUser:ActiveConnection
oRdbms := FW_RDBMSName( oCn )
CATCH oError
ado_ErrorNoRecordSet(oError) // Mensaje de Error
oRsUser := nil
END
RETURN oRsUser
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
FUNCTION ado_CierraRecordSet( oRs )
//----------------------------------------------------------------------------//
local oErr
TRY
oRs:Close()
oRs := Nil
CATCH oErr
ado_ErrorNoRecordSet(oErr)
END
oRs := Nil
RETURN NIL
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
FUNCTION ado_Borrar( oRs )
//----------------------------------------------------------------------------//
LOCAL n
LOCAL oErr1, oErr2, oErr3
if MsgYesNo( "¿ Desea BORRAR este Registro ?."+CRLF+CRLF+"Si tiene dudas, seleccione No.", " B O R R A R R E G I S T R O" )
if oRs:RecordCount() = 0
MsgAlert("ERROR: No hay ningún registro en la tabla."+CRLF+CRLF+"No hay nada que BORRAR.", " E R R O R ")
RETURN NIL
endif
n := oRs:AbsolutePosition
try
oRs:Delete()
catch oErr1
MsgStop("ERROR: No se ha podido ejecutar la operación de borrado."+CRLF+CRLF+oErr1:Description, " E R R O R ")
return(.f.)
end
///oRs:Update()
If !oRs:RecordCount() = 0
oRs:AbsolutePosition := Min( n, oRs:RecordCount() )
endif
MsgInfo("El Registro ha sido BORRADO correctamente.", " A V I S O ")
else
MsgInfo("El USUARIO ha cancelado la operación de Borrar.", " A V I S O ")
endif
RETURN NIL
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
FUNCTION ado_ErrorNoRecordSet(oErr)
//----------------------------------------------------------------------------//
//local nErr, oErr, cErr
local cErr
local oConexion := oCn
local cInstruccion := "" //oErr:Args[1]
//
// fix oErr:Args[1], a veces está vacío
//--------------------------------------
if HB_IsNil( oErr:Args )
cInstruccion := space(1)
else
cInstruccion := oErr:Args[1]
endif
//if ( nErr := oConexion:Errors:Count ) > 0
// oErr := oConexion:Errors( nErr - 1 )
WITH OBJECT oErr
cErr := "No se puede ejecutar la instrucción " + cValToChar( cInstruccion )
cErr += CRLF+CRLF+oErr:Description
cErr += CRLF+CRLF + 'Operación : ' + cValToChar( oErr:Operation )
cErr += CRLF+CRLF + 'Fuente del Error : ' + cValToChar( oErr:Filename )
MsgAlert( cErr, "ADO ERROR RecordSet" )
END
//else
// MsgAlert( "ADO ERROR desconocido." )
//endif
RETURN NIL
//----------------------------------------------------------------------------//
*-------------------------------------------------------------------------------
FUNCTION ADO_RecCount(oRs)
*-------------------------------------------------------------------------------
local nRecord := 0
nRecord := oRs:AbsolutePosition()
nRecord := iif(nRecord=nil,-1,nRecord)
if nRecord < 1
return 0
else
return oRs:RecordCount()
endif
return 0
*-------------------------------------------------------------------------------