/*
SqlAdo.prg

Este prg antes contenia el contenido de ado.prg
Lo he separado para facilitar la integración de ado.prg en sus sistemas

Pueden compilar usando:
Build sqlado ado		// \oohg\build.bat
o cualquier otra forma, solo que se requieren:
SqlAdo
Ado
adordd.ch

Notas:
1. Seleccionar la opcion Conectar antes de Browse
	En caso de seleccionar DBase como motor SQL:
		solo es necesario ingresar en Database el disco o ruta especifica,
		No se requiere datos de servidor ( a menos que se encuentre en otro lado )
		Especificar ruta en el comando SELECT * FROM ruta_completa en caso de ser distinto a lo puesto en Database
		OJO, Da error de "La tabla externa no tiene el formato esperado" cuando existe un campo MEMO
*/
#include "oohg.ch"

#include "Hbclass.ch"

#xcommand TRY  => BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#xcommand FINALLY => ALWAYS

MEMVAR oConn, hSql

Procedure Main()
Local oApp
Public oConn, hSql := {=>}

	SET NAVIGATION EXTENDED						// usar enter = tab
	SET BROWSESYNC ON	
	SET AUTOADJUST ON
	SET ADJUSTFONT OFF

	_OOHG_WinReleaseSameOrder := .F.			// Cerrar ventanas en orden inverso al abierto
	_OOHG_NestedSameEvent(.T.)

	SET CENTURY ON
	SET DATE FRENCH

	DEFINE WINDOW Win_1 OBJ oApp AT 0,0 WIDTH 300 HEIGHT 100 ;
		TITLE "Pruebas con ADO " ;
		ON INIT LeerIni(oApp);
		MAIN ON RELEASE {|| CerrarSistema() }
		
		DEFINE MAIN MENU
			ITEM "&Conectar"    	ACTION Conectar()
			ITEM "Browse"			Action BrowseTabla(oConn)
		END MENU
		
//		@ 10,30 Label msg VALUE "Prueba" AUTOSIZE
	END WINDOW
	oApp:Activate()
Return

	
Procedure LeerIni()

	if(hb_IsObject(oConn) .and. oConn:State > 0, oConn:Close(),)

	IF FILE("SqlAdo.ini")
		hSql := hb_iniRead("SqlAdo.ini",,,.F.)
		oConn := AdoConn(hSql["Servidor"], hSql["Database"], hSql["User"], hSql["Pass"], hSql["Engine"] )
	Else
		oConn := Conectar()
		Hb_IniWrite("SqlAdo.ini", hSql)
	Endif
Return

Procedure CerrarSistema()
	If HB_IsObject(oConn) .and. oConn:State > 0
		oConn:Close()
	Endif
Return
	
Procedure BrowseTabla(oC)
Local oWin, oBrw, oRs, aFields := {}, aHeaders := {}, aReplace := {},  n
Static aResult := {""}
	If !Hb_IsObject(oC)
		MsgStop("Es necesario realizar primeramente la conexion","Error")
		Return
	Endif

	aResult := InputWindow("Comando Sql", {""}, aResult, {200},,,,,800)
	If aResult[1] = NIL
		aResult := {""}
		Return
	Endif

	TRY
		oRs := DBADO():New(aResult[1], oC)
	Catch
		ADOError(oC)
		Return
	End Sequence

	For n := 1 TO oRs:oRs:Fields:Count()
		AADD(aHeaders, oRs:oRs:Fields(n-1):Name)
		AADD(aFields, &("{|wa| wa:"+oRs:oRs:Fields(n-1):Name+" }"))
		AADD(aReplace, oRs:FieldBlock(n))
	Next n


	DEFINE WINDOW "0" AT 0, 0 OBJ oWin WIDTH 800 HEIGHT 530 Title aResult[1] ;
		CHILD ON RELEASE oRs:Close()
		ON KEY ESCAPE ACTION oWin:Release()
		ON KEY F5 ACTION {|| oRs:Refresh(), oBrw:Refresh()}

		@ 1, 1 XBROWSE Tb OBJ oBrw;
			WIDTH 780 ;
			HEIGHT 430 ;
			WORKAREA ( oRs  ) ;	
			HEADERS aHeaders ;
			FIELDS aFields ;
			EDIT INPLACE EDITLIKEEXCEL;
			DELETE ;
			DELETEWHEN {|| MsgYesNo("Desea borrar este registro") }; 
			ONDELETE oRs:Update();
			APPEND;
			REPLACEFIELD aReplace ;
			FIXEDBLOCKS
		
		oBrw:Cargo := aHeaders
		@ 450, 300 Button OK CAPTION "Guardar" WIDTH 80 HEIGHT 28 ACTION {|| oRs:Update(), oWin:Release() } 
		@ 450, 500 Button Cancel CAPTION "Salir" WIDTH 80 HEIGHT 28 ACTION oWin:Release() 
	END WINDOW
	oWin:Center()
	oWin:Activate()
Return

/*-----------------------------------------------------------------------------*
Funcion que escribe valores a un archivo "Message.txt" que utilizo para depurar.
Si el archivo existe, escribe al final, si no existe lo crea.
*-----------------------------------------------------------------------------*/
Procedure db_text(xtext)
Local nHandle
	xText := AutoType(xText)
	IF FILE("Message.txt")
		nHandle := FOPEN("Message.txt", 65)
	ELSE
		nHandle := FCREATE("Message.txt")
	ENDIF
	IF nHandle < 0
		msgbox("Error abriendo Message.txt")
	ENDIF
	FSEEK(nHandle, 0, 2)	//go to end of file
	FWRITE(nHandle, xtext+hb_eol())
	FCLOSE(nHandle)
Return

