Página 1 de 1

Consulta a base de datos Access

Publicado: 03 Sep 2014, 00:59
por kemazonico
Hola amigos, tengo un detalle con un programa que estoy creando para usar como Punto de Venta....

El detalle es que la primer parte que hace una consulta a la tabla tpv_Productos corre perfectamente, pero cuando llama a la funcion unidades() esta, a pesar de tener el valor de la variable $unidades arroja error en la consulta, sin embargo si en lugar de usar la variable ponemos el valor fijo, esta consulta se realiza sin problemas.

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Inventario = GUICreate("Productos e Inventario", 466, 494, 250, 166)
$cProductos = GUICtrlCreateCombo("", 16, 24, 337, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$bObtener = GUICtrlCreateButton("Obtener", 368, 24, 75, 25)
$iProducto = GUICtrlCreateInput("", 104, 80, 353, 21)
$iCodigo = GUICtrlCreateInput("", 104, 112, 353, 21)
$lNombre = GUICtrlCreateLabel("Producto", 52, 88, 45, 17)
$lCodigo = GUICtrlCreateLabel("Codigo de barras", 15, 120, 80, 17)
$iPrecio1 = GUICtrlCreateInput("", 104, 160, 113, 21)
$iUnidad = GUICtrlCreateInput("", 232, 160, 105, 21)
$iPrecio3 = GUICtrlCreateInput("", 352, 160, 105, 21)
$lPrecio1 = GUICtrlCreateLabel("Precio", 104, 144, 40, 16)
$lUnidad = GUICtrlCreateLabel("Unidad", 232, 144, 40, 16)
$lPrecio3 = GUICtrlCreateLabel("Otro", 352, 144, 40, 16)
$cCategoria = GUICtrlCreateCombo("", 104, 200, 241, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Input6 = GUICtrlCreateInput("Input6", 104, 240, 113, 21)
$Input7 = GUICtrlCreateInput("Input7", 104, 272, 113, 21)
$bCambiaCat = GUICtrlCreateButton("Ver categorias", 360, 200, 75, 25)
$Button3 = GUICtrlCreateButton("Button3", 232, 240, 75, 25)
$Button4 = GUICtrlCreateButton("Button4", 232, 272, 75, 25)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 328, 240, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 328, 272, 97, 17)
$Edit1 = GUICtrlCreateEdit("", 24, 320, 281, 145)
GUICtrlSetData(-1, "Edit1")
$Button5 = GUICtrlCreateButton("Button5", 320, 336, 123, 25)
$Button6 = GUICtrlCreateButton("Button6", 320, 376, 123, 25)
$Button7 = GUICtrlCreateButton("Button7", 320, 416, 123, 25)
$lCategoria = GUICtrlCreateLabel("Categoria", 48, 208, 45, 17)
$Label7 = GUICtrlCreateLabel("Label7", 56, 248, 36, 17)
$Label8 = GUICtrlCreateLabel("Label8", 56, 280, 36, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Productos()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $bObtener
			$Producto = GUICtrlRead ($cProductos)
			$dbname = 'C:\POS\Base.mdb'
			$tbl_Productos = "tpv_Productos"
			$query = "SELECT * FROM " & $tbl_Productos & " WHERE Producto = '" & $Producto & "'"
			$adoCon = ObjCreate("ADODB.Connection")
			$adoCon.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & $dbname)
			$adoRs = ObjCreate ("ADODB.Recordset")
			$adoRs.CursorType = 1
			$adoRs.LockType = 3
			$adoRs.Open ($query, $adoCon)
			GUICtrlSetData ($cProductos, $adoRs.Fields("Producto").value)
			GUICtrlSetData ($iProducto, $adoRs.Fields("Producto").value)
			GUICtrlSetData ($iCodigo, $adoRs.Fields("Clave").value)
			GUICtrlSetData ($iPrecio1, $adoRs.Fields("Costo").value)
			Global $unidad = $adoRs.Fields("unidad").value
			$adoCon.Close
			Sleep (1000)

unidades()

	EndSwitch
WEnd

Func Unidades()
	$dbname = 'C:\POS\Base.mdb'
	$tbl = "tpv_unidades"
	ConsoleWrite ($unidad & @CRLF)
	$query1 = "SELECT * FROM " & $tbl & " WHERE numero = '" & $unidad & "'"
	$adoCon = ObjCreate("ADODB.Connection")
	$adoCon.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & $dbname)
	$adoRs = ObjCreate ("ADODB.Recordset")
	$adoRs.CursorType = 1
	$adoRs.LockType = 3
	$adoRs.Open ($query1, $adoCon)
	GUICtrlSetData ($iUnidad, $adoRs.Fields("unidad").value)

	$adoCon.Close
EndFunc


Func Productos()
	$dbname = 'C:\POS\Base.mdb'
	$tbl_Productos = "tpv_productos"
	$query = "SELECT * FROM " & $tbl_Productos & "'"
	$adoCon = ObjCreate("ADODB.Connection")
	$adoCon.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & $dbname)
	$adoRs = ObjCreate ("ADODB.Recordset")
	$adoRs.CursorType = 1
	$adoRs.LockType = 3
	$adoRs.Open ($query, $adoCon)
	While Not $adoRs.EOF
	GUICtrlSetData ($cProductos, $adoRs.Fields("Producto").value)
	$adoRs.MoveNext
	WEnd

			$adoCon.Close
EndFunc
Estoy atorado con esto, seguramente sera algo sencillo, pero no logro ubicar el problema.

Re: Consulta a base de datos Access

Publicado: 03 Sep 2014, 02:50
por Chefito
Puede ser por un problema de tipos. Has probado a pasarle el número sin comillas?

Código: Seleccionar todo

$query1 = "SELECT * FROM " & $tbl & " WHERE numero = " & $unidad
Saludos.

Re: Consulta a base de datos Access

Publicado: 06 Sep 2014, 01:30
por kemazonico
Chefito escribió:Puede ser por un problema de tipos. Has probado a pasarle el número sin comillas?

Código: Seleccionar todo

$query1 = "SELECT * FROM " & $tbl & " WHERE numero = " & $unidad
Saludos.
Maestro!! :D Problema solucionado!

Ahora aprovechando la oportunidad...
no tento idea de como hacer que al escribir cierta cantidad de digitos (en esta caso, con 8 digitos es suficiente) en un input, en automatico se ejecute una funcion que va a hacer consultas ala base de datos y despues llenar un combobox, como si de un "autorrelleno" se tratara (para esto planeo usar _GUICtrlComboBox_AutoComplete).

Saludos.

Re: Consulta a base de datos Access

Publicado: 06 Sep 2014, 04:02
por Chefito
Utiliza los eventos de un edit. En este caso te sirve perfectamente el evento $EN_CHANGE, que se produce cuando hay algún cambio dentro del edit. Mira la udf guiedit en la ayuda. Son todas las funciones que empiezan por _GUICtrlEdit_ . Y mira el ejemplo de la función _GUICtrlEdit_Create. Ahí verás como utilizan los eventos de este control.
He adaptado un poquito el ejemplo de esta función para que veas como se hace más o menos lo que quieres. He puesto el control edit para que solamente puedas introducir dígitos (eso decías en el post), que solo tenga una línea (que no sea multilínea), y por si acaso, que te acepte los return del teclado por si acaso quieres hacer algo. Estas propiedades las puedes ver y cambiar a tu antojo en el parámetro $iStyle de la función _GUICtrlEdit_Create.

Código: Seleccionar todo

#include <GuiEdit.au3>
#include <WinAPI.au3> ; used for Lo/Hi word
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

Global $hEdit

Example()

Func Example()
    Local $hGUI

    ; Create GUI
    $hGUI = GUICreate("Edit Create", 400, 300)
    $hEdit = _GUICtrlEdit_Create($hGUI, "", 2, 2, 394, 20, $ES_NUMBER+$ES_AUTOHSCROLL+$ES_WANTRETURN)
    GUISetState(@SW_SHOW)

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()
EndFunc   ;==>Example

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    If Not IsHWnd($hEdit) Then $hWndEdit = GUICtrlGetHandle($hEdit)
    $hWndFrom = $ilParam
    $iIDFrom = _WinAPI_LoWord($iwParam)
    $iCode = _WinAPI_HiWord($iwParam)
    Switch $hWndFrom
        Case $hEdit, $hWndEdit
            Switch $iCode
				Case $EN_CHANGE ; Sent when the user has taken an action that may have altered text in an edit control
					$TextLen=_GUICtrlEdit_GetTextLen ($hEdit)
					If $TextLen>7 Then
						ConsoleWrite("Has escrito " & $TextLen & " caracteres. Ejecuta aquí dentro el código o función que quieras" & @CR)
					EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
Mira bien todo en la ayuda. Si tienes algún problema coméntalo.

Saludos.