Datagrid

Me gustaría acceder a un dato concreto del datagrid, es decir, acceder a una fila y a una columna en concreto. ¿Cómo se hace?
1

1 respuesta

Respuesta
1
Claro, pero en el datagrid no recuerdo ahora mismo como empieza a contar las columnas, me explico, en el dbgrid las columnas empiezan a contar por el 0 en el datagrid no recuerdo pero no tiene mayor dificultad lo ruebas empezando por el 0 y sino es el 1 y así hasta todas las columnas que tengas.
Bueno espero haberte resuelto la duda
Pues bien para ir a una fila y columna este es el código
datagrid1.col= numero_columna
datagrid1.row=numero_fila
Bien espero que te ayude
Una duda, ¿en lo que me has dicho eso de numero_columna es el numero de columna donde esta el dato que yo quiero acceder no?
He hecho lo que me dijiste que hiciera y este es el código que he puesto:
Dim numero_columna
Dim numero_fila
numero_col = 1
DataGrid1.Col = numero_columna
DataGrid1.Row = numero_fila
For numero_fila = 1 To 6
If DataGrid1.Row = TxtNumero Then
MsgBox "El numero ya existe"
end if
next numero_fila
Pero no hay manera.Lo tuyo me sirvió pero solo para una fila en concreto, pero me haría falta que recorriera la fila entera para comprobar que el numero que yo introduzca no esta en toda esa fila.
Como puedo hacer que me recorra la fila entera para ver si existe o no.
Hola, me equivoque, no era la fila sino la columna.A ver lo que quiero hacer es que de la primera Columna del datagrid me recorra todas las filas y luego compruebo que el numero que yo introduzco si existe ese numero o no.
Con el código que me has dado lo he intentado poner en vez de fila a columna pero no me sale. Espero su respuesta.
A ver tu quieres que desde un principio te coloques en la fila 2 por ejemplo y que en esa fila están los campos (código, numero,...) pero solo en esa fila, es decir, ¿qué recorra todos los campos que hay en esa fila y que compruebe que el número que tu introduces en un control cual sea existe en esa fila no?.
Lo primero cuenta los campos que tienes y haz lo siguiente:
(Ejemplo: si en tu datagrid están los campos código, numero, código esta en la columna tercera del ddatagrid y numero en la cuarta, recuerda que la primera columna en un datagrid se cuenta como el 0 y así sucesivamente )
Dim numero_columna
For numero_columna = 0 To 'aqui debes de poner el numero de campos que tienes o que quieres que recorra
DataGrid1.Col = numero_columna
DataGrid1.Row = 'aqui pon la fila que quieres que recorra
If DataGrid1.Columns(0) = Text1.Text Then
MsgBox "El numero ya existe"
End If
Next numero_columna
Bien espero que esto te ayude lo he probado funciona, y ya sabes para alguna otra duda aquí estoy.
No hay forma me vuelve a decir que no se puede insertar ya que se crearía valores duplicados en la tabla.
Pues a ver el código es parecido pero bueno aquí lo tienes:
Dim numero_fila
For numero_fila = 0 To 5
DataGrid1.Col = 0
DataGrid1.Row = numero_fila
If DataGrid1.Columns(0) = Text1.Text Then
MsgBox "El numero ya existe"
End If
Next numero_fila
Otra vez.
Pues bien aquí tienes el código para insertar.
Dim numero_fila
Dim sw As Integer
sw = 0
For numero_fila = 0 To 5
DataGrid1.Col = 0
DataGrid1.Row = numero_fila
If DataGrid1.Columns(0) = Text1.Text Then
MsgBox "El numero ya existe"
sw = 1
End If
Next numero_fila
If sw = 0 Then
Data1.Recordset.MoveLast
Data1.Recordset.AddNew
Data1.Recordset.Fields("codigo") = Text1.Text
Data1.Recordset.Update
Data1. Refresh
Adodc1. Refresh
End If
Recuerda que en la tabla donde quieras insertar los datos, hay campos los cuales tienen unos "privilegios", como "requerido", "permitid lomgitud cero" debes controlarlo y no olvidarte de ningún campo, sino te seguirá dando errores.
Bueno a ver si tu problema se soluciona
Imposible, me sigue dando errores ahora me dice que se requiere un objeto y cada vez que pulso el botón almacen me sale 3 veces el mensaje "el numero ya existe".
¿Una cosa este código lo puedo poner directamente en el txtnumero?
Otra vez
Sobre lo de que te sale 3 veces el mensaje "el numero ya existe", es normal porque busca el numero introducido fila por fila y cada vez que encuentra dicho numero te dice que ya existe, si quieres ahorrarte lo del mensaje bórralo y deja solo lo del "sw=1", añádele un else al programa detrás de sw=1 con el mensaje,"el numreeo no existe", así sol te saldrá un mensaje y sabrás que el numero introducido no existe y te lo agragara.
Sobre lo que requiere un objeto, si no me das más detalles no sabrá solucionártelo, ¿sobre qué objeto te dice que da el erro?
¿Tu usas el componente adodc no? Mira lo a ver si no utilizas adodc y utilizas datasource solo tienes que cambiarlo, pero con un datasource no lo puedes enlazar a un datagrid sino a un dbgrid. Bueno yo lo único que puedo saber or el momento es que el objeto que se requiere en tu proyecto es el adodc si utulizas otro ya sabes lo cambias y ya esta es sencillo.
Bueno que tengas mucha suerte y de nuevo Saludos.
Esto parece que no se arregla nunca, ahora no me sale lo del objeto ni que la clave esta duplicada ya que en la base de dato le he quitado la clave principal que era en este caso numero.
El código entero es este:
Private Sub CmdGrabar_Click()
If TxtNumero = "" Then
MsgBox "Introduzca Numero del Almacen"
Else
If TxtNombre = "" Then
MsgBox "Introduzca Nombre del Almacen"
Else
If TxtDireccion = "" Then
MsgBox "Introduzca Direccion del Almacen"
Else
If TxtCP = "" Then
MsgBox "Introduzca Código Postal"
Else
sw = 0
For numero_fila = 0 To 5
DataGrid1.Col = 0
DataGrid1.Row = numero_fila
If DataGrid1.Columns(0) = TxtNumero.Text Then
sw = 1
Else
MsgBox "el numero no existe"
End If
Next numero_fila
If sw = 0 Then
Data1.Recordset.MoveLast
Data1.Recordset.AddNew
Data1.Recordset.Fields("numalm") = TxtNumero.Text
Data1.Recordset.Update
Data1.Refresh
Adodc1.Refresh
End If
CmdAlta.Enabled = True
CmdGrabar.Enabled = False
End If
End If
End If
End If
End Sub
Este es el código entero que tengo puesto en el botón GRABAR. Pero resulta que ya aunque meta un numero que ya existe eso se lo traga y ya no me sale ni mensaje ni nada.A parte de eso si yo doy de alta un nuevo almacen se me ha añadido una fila nueva, entonces ya me da error en el For y me dice que el numero de filas es incorrecta.
El código esta bien lo que falla es un pequeño error de calculo por nuestra parte
¿A qué seguro que tu bd tiene más de 5 registros?
Yo te mande ... "for numero_fila=0 to 5 " para darte un ejemplo deberías de hacer esto antes de dicho "For"
Dim x as integer
data2.recordsource="select count(numero)from nombre_tabla"
data2.refresh
x=data2.recordset.fields(0)
Entonces en lugar de el 5 pones la x
For numero_fila=0 to x-1
Ahora el problema de que te añada el numero si existe desaparecerá, es que antes solo miraba los primeros 5 registros y claro no todos.
También deberías de refrescar cada vez que regitres para que ahora cuando el data2 realize el count coja también el ultimo alta que hayas echo.
Creo que con eso se solucionaran tus problemas sino dímelo y veremos que es lo que te pasa.
Suerte y saludos
Hola de nuevo. Ahora me dice que se requiere un objeto y me señala el recordsource de este código:
datagrid1.recordsource="select count(numalm)from almacen"
datagrid1.refresh
x=datagrid1.recordset.fields(0)
Y creo que es px est objeto no existe con el datagrid1.
Pues no ese objeto no existe en el datagrid, si te fijas bien te he puesto data2. Recorsource, no datagrid1. Recorsource, aunque si prefieres trabajr tu con "adodc" da igual solo era en modo de ejemplo ya cada uno utiliza la conexión a la BD que más prefiera, cambia lo del datagrid1. Recordsource por el data2. Recordsource o adodc1. Recordsource.
Ahí tienes el prolbema fíjate un poco y mira que todo esta bien que ha sido un pequeño despiste.
Suerte y saludos
Hola de nuevo, he puesto adodc1 en vez de data2 pero eso sigue sin funcionar me da el mensaje de que no se puede dar de alta ya que habría valores duplicados y me señala el error en DataGrid1. Row = numero_fila.
Entonces probé y en el access a numero le quite la clave principal y entonces no me sale lo de los valores duplicados pero me da de alta el numero que ya existe.En fin un lio, no se ahora donde estará el fallo. Espero su respuesta.
Otra vez
Haber vamos a empezar. Tu quieres que cuando pulses un botón se recorra todo los registros que tienes, si en el campo "Numero" existe un numero igual al que tu escribes dentro de la caja de texto(text1.text) entonces que te diga que el "numero ya existe" y si no existe que te añada dicho numero,¿no es asi?, pues bien como veo que te esta dndo muchos problemas haremos otra cosa que es más sencilla y que no te dará ningún error.
Añade 2 datasource(data1 y data2)
Añade un control adodc(adodc1)
Añade un datagrid(datagrid1)
Añade un botón (command1)
Hasta ahí correcto
1.- Enlaza al datagrid1 el control adodc1, en la propiedad datasource.
2.- En la propiedad connectionstring de adodc1, generas la consulta, luego en el recordsource de dicho control escribes "select * from tabla"
3.-Tanto al data1, data2 en la propiedad Databasename enlazas la base de datos y en la propiedad Recordsource señalas la tabla donde están el Numero,..., etc.
Bien ahora escribes el siguiente código
Private Sub Command1_Click()
Dim a As Long
Data1.RecordSource = "select * from tabla1 where numero=" & TxtNumero.text
Data1.Refresh
If Data1.Recordset.AbsolutePosition = 0 Then
MsgBox "ya existe"
Else
MsgBox "no existe"
Data2.Recordset.MoveLast
Data2.Recordset.AddNew
Data2.Recordset.Fields("campo_numero") = txtNumero.text
Data2.Recordset.Fields("campo_nombre") = TxtNombre.text
Data2.Recordset.Fields("campo_direccion") = TxtDireccion.text
Data2.Recordset.Fields("campo_cp") = txtCP.text
Data2.Recordset.Update
Data1.Refresh
Data2.Refresh
Adodc2.Refresh
End If
End Sub
Esperemos que esta vez se te solucione, siento la tardanza, Suerte(pero mucha suerte)
Hola, lo he hecho de otra forma y me sale, ¿el problema es que antes me sale una ventanita de que los valores no se pueden duplicar y después me sale el mensaje de que ya existe.Lo dejo así? ¿Tiene importancia eso?
El código que he puesto es este:
If TxtNif = "" Then
MsgBox "Introduzca el Nif del Cliente"
Else
If TxtNombre = "" Then
MsgBox "Introduzca el Nombre"
Else
If TxtApellido = "" Then
MsgBox "Introduzca el Apellido"
Else
If TxtDireccion = "" Then
MsgBox "Introduzca la Dirección"
Else
If TxtCP = "" Then
MsgBox "Introduzca el CP"
Else
Dim vBookmark2 As Variant ' En ADO debe ser Variant, no vale un String
Dim sADOBuscar2 As String
'
' Iniciamos la detección de errores
On Error Resume Next
'
' Buscar la primera coincidencia en el recordset del Data1
If Option1.Value Then
' en el campo nifcli
sADOBuscar2 = "nifcli Like '" & TxtNif.Text & "'"
End If
If Option2.Value Then
' en el campo nomcli
sADOBuscar2 = "nomcli Like '" & TxtNombre.Text & "'"
End If
' Guardar la posición anterior, por si no se halla lo buscado...
vBookmark2 = Adodc1.Recordset.Bookmark
'
If Siguiente = False Then
' Buscar desde el principio
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Find sADOBuscar2
Else
' Busca a partir del registro actual
Adodc1.Recordset.Find sADOBuscar2, 1
End If
' Devolverá un error si no se halla lo buscado
' aunque no siempre es así...
If Err.Number Or Adodc1.Recordset.BOF Or Adodc1.Recordset.EOF Then
Err.Clear
MsgBox "Ya existe el Nif del Cliente,Introduzca otro."
' Posicionar el recordset en la posición guardada
Adodc1.Recordset.Bookmark = vBookmark2
Else
CmdGrabar.Enabled = False
CmdAlta.Enabled = True
End If
End If
End If
End If
End If
End If
End Sub
Sino tiene importancia lo dejo así ya que ya mismo lo tengo que entregar y no me queda tiempo.
Una cosa que me gustaría preguntarte, me gustaría que al introducir el código postal solo me dejara meter 5 dígitos y no más, ¿cómo puedo hacer eso?
Gracias por haberme contestado anteriormente y espero su respuesta lo antes posible.
Me alegro de que te vaya
Y lo de la importncia es la que tu quieras darle, si a ti no te molesta pues esta bien.
Lo de meter solo cinco dígitos usa el control maskedit esta en componentes:Microsoft maskedit control
Es igual que una caja de texto solo que con ella puedes restringir que deseas introducir dentro de la caja.
Después de introducir en tu formulario maskedit en la propiedad "Mask" introduce "#" tantas veces como números deseas tener.
ej: 5 numeros = #####
Para las letras es la "?".
Bueno espero que te sirve y buena suerte.
Hola, gracias por tu ayuda.He acabado mi programa pero tengo un pequeño problema, y es que yo en un text1.text puse el siguiente código:
Private Sub Text1_Change()
Text1.Text = FrmHacerFactura.TxtNifcli
End Sub
Para que me saliera automáticamente el mismo nif que yo pongo en el formulario HacerFactura.El problema es que siempre me sale el primero, ¿qué debo de hacer para que me saque siempre el ultimo? Espero que me puedas ayudar antes del lunes.
Tu problema es que cuando insertas un nif en text1 te aparezca en el formulario " FrmHacerFactura" las referencias al nif.
Pues el problema creo ver es que has escrito al revés la fórmula
Private Sub Text1_Change()
FrmHacerFactura.TxtNifcli = Text1.Text
End Sub
Ponlo así a ver si te soluciona el problema.
Siento no haber respondido antes pero los fines de semana no me meto mucho por aquí.
Suerte y saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas