Autor Tema: contador en vb.NET  (Leído 7492 veces)

0 Usuarios y 1 Visitante están viendo este tema.

ale_xi

  • Bytes
  • *
  • Mensajes: 30
  • Reputación: +3/-1
    • Ver Perfil
contador en vb.NET
« en: Octubre 13, 2016, 12:51:32 am »
Hola a todos, no sé  como hacer un Contador   y que Chequee el código de la base de datos según la tabla,  en .NET, base de datos de Firebird, ya hice las conexiones en Odbc, pero como recien estoy aprendiendo a programar vb.NET, tengo conocimientos en VB 6.0

Aquí dejo código conexiones

Código: [Seleccionar]
mports System.Data.Odbc

Public Base As New OdbcConnection("DSN=REPUESTOS; Uid=SYSDBA; Pwd=masterkey")
    Public Sub conectar()
        Try
            Base.Open()
        Catch ex As Exception
            MsgBox("No se establecio la conexión con la Base de Datos", MsgBoxStyle.Question, "Repuestos")
            End
        End Try
    End Sub

Aquí dejo código de contador en .NET

Código: [Seleccionar]
  Private Sub BuNuevo_Click(sender As Object, e As EventArgs) Handles BuNuevo.Click
        Dim dT As New DataTable
        Dim s As String = ""
        Dim Sql As String = "Select count(CODIGO) from REPUESTOS"
        Dim Da As New OdbcDataAdapter(Sql, Base)
        Da.Fill(Dt)
        If dT.Rows.Count < 0 Then
            Me.TeCodi.Text = "1"
        Else
            Me.TeCodi.Text = dT.Rows.Count + 1
        End If
    End Sub

Los antes utilizaba de contador en vb6

Código: [Seleccionar]
  With Rs1
    If .State = 1 Then .Close
       .Open "select CODIGO from VENDEDOR", Base, 1, 1
  End With

 If Rs1.BOF Or Rs1.EOF Then
   Me.TexCodi = "100"
 Else
  Rs1.MoveLast
  Me.TexCodi = Rs1(0) + 1
 End If

Ojala que me hayan entendido............  Gracias de antemano


Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #1 en: Octubre 13, 2016, 09:20:06 am »
Hola, ale_xi.
No sé programar en .NET ni con Firebird (qué hago aquí, entonces, ¿no?), pero quiero comentarte algo por si te sirve.
En MySQL "COUNT" cuenta la cantidad de registros que cumplen determinados requisitos. Para lo que buscás se usa (insisto: en MySQL, a lo mejor en Firebird no) "MAX". Eso trae el valor máximo del campo que le pongas como parámetro.
Sería así:
Código: (SQL) [Seleccionar]
Select MAX(CODIGO) from REPUESTOSEse mismo tipo de consulta a mí a veces me tarda un segundo (es más de lo que debiera demorar). Seguramente sea por un problema de diseño de mi base de datos. Lo resolví haciendo la consulta de la siguiente manera:
Código: (SQL) [Seleccionar]
Select CODIGO from REPUESTOS order by CODIGO desc limit 1Ahí el resultado es el mismo, pero más rápido.
Saludos.

Jerónimo


ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #2 en: Octubre 13, 2016, 10:27:26 am »
Muy buenos días a todos !!!

ale_xi, un pequeño "detallito" con la consulta para efectuar el conteo:
Código: (VB) [Seleccionar]
Dim Sql As String = "Select count(CODIGO) from REPUESTOS"
Debería ser así:
Código: (VB) [Seleccionar]
Dim Sql As String = "Select Count(CODIGO) As Total From REPUESTOS"
Ahora si necesitas hacer uso de ese 'contador', porque necesitas el nro, cantidad o total de algo, puedes hacer esto:
Código: (VB) [Seleccionar]
Dim Sql As String = "Select Count(CODIGO) As Total From REPUESTOS"
Dim _total As Integer = 0
Dim Cmd As New FbCommand(Sql, Base)
'//
_total = CType(FbCmd.ExecuteScalar, Integer)

En la variable _total, almacenas el valor del contador Total que está dentro de la consulta...


Espero te pueda servir de algo !!!



Saludos !!!

Manuel F. Borrego Sterling 8)
Barcelona, Edo. Anzoátegui. Venezuela.
[Mientras nos permitan seguir comunicándonos...]
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

ale_xi

  • Bytes
  • *
  • Mensajes: 30
  • Reputación: +3/-1
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #3 en: Octubre 13, 2016, 04:22:14 pm »
hola ,   no me funciono el código, lo q intento hacer, que el usuario tenga que escribir todos los demas registros, pero no el CODIGO, pero que siempre en la Base de Datos se guarde..

como seria el codigo, para que el primer Repuestos de  Automóvil  que entre el Codigo se "CODIGO-100" y luego se guarde y cuando ingrese otro sea este "CODIGO-101" y asi

si quieres te doy un ejemplo con un programa pequeño en vb 6.0 , de lo que yo necesito en .NET

Gracias por tú ayuda
« última modificación: Octubre 13, 2016, 05:00:03 pm por ale_xi »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:contador en vb.NET
« Respuesta #4 en: Octubre 14, 2016, 12:24:14 am »
... Para lo que buscás se usa (insisto: en MySQL, a lo mejor en Firebird no) "MAX"....
Jerónimo

Estimadisimo, en Firebird si existe la función MAX.

Saludos
Me encuentras en YAcosta.com

Luffy

  • Kilobyte
  • **
  • Mensajes: 90
  • Reputación: +4/-2
  • Desarrollar es el arte de crecer no de crear.
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #5 en: Octubre 14, 2016, 11:43:55 am »
Tu problema no es la sintaxis en VB.net sino en tu lógica de programar.

Para hacer existen variad formas:

1. Creas una consulta en la base de datos y desde VB solo llamas la consulta para recuperar el valor del campo.

2. Crear un tigger que después que guarde actualice el campo que quieres. (Yo haría eso)

3. Crear un store procedure para poder generar tu código en tu tabla.

Estamos tan acostumbrados a nuestro lenguaje de programación que lo queremos resolver todo con eso. Saludos.

Enviado desde mi AX600 mediante Tapatalk


ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #6 en: Octubre 18, 2016, 08:50:41 am »
hola ,   no me funciono el código, lo q intento hacer, que el usuario tenga que escribir todos los demas registros, pero no el CODIGO, pero que siempre en la Base de Datos se guarde..

como seria el codigo, para que el primer Repuestos de  Automóvil  que entre el Codigo se "CODIGO-100" y luego se guarde y cuando ingrese otro sea este "CODIGO-101" y asi

si quieres te doy un ejemplo con un programa pequeño en vb 6.0 , de lo que yo necesito en .NET

Gracias por tú ayuda

Muy buenos días !!! De nuevo por aquí...

A verrrr... El código que te pasé:
Muy buenos días a todos !!!

ale_xi, un pequeño "detallito" con la consulta para efectuar el conteo:
Código: (VB) [Seleccionar]
Dim Sql As String = "Select count(CODIGO) from REPUESTOS"
Debería ser así:
Código: (VB) [Seleccionar]
Dim Sql As String = "Select Count(CODIGO) As Total From REPUESTOS"
Ahora si necesitas hacer uso de ese 'contador', porque necesitas el nro, cantidad o total de algo, puedes hacer esto:
Código: (VB) [Seleccionar]
Dim Sql As String = "Select Count(CODIGO) As Total From REPUESTOS"
Dim _total As Integer = 0
Dim Cmd As New FbCommand(Sql, Base)
'//
_total = CType(FbCmd.ExecuteScalar, Integer)

En la variable _total, almacenas el valor del contador Total que está dentro de la consulta...

Te reitero, la instrucción COUNT() lo que hace es, 'contar' el número de registros que tienes en una tabla determinada, sin importar los valores que tengas almacenados en cada uno de ellos... A través de la variable _total.
La instrucción MAX(), te proporciona el valor más alto del campo que estés evaluando (en tu caso, Codigo), siempre y cuando dicho campo sea numérico, y creo que como lo estás planteando, tu campo debe ser del tipo String, por lo tanto la instrucción MAX() no te va a servir de nada (sino, que me corrija mi gran amigo y Gurú de FirebirdSQL, el gran Ivan -YAcosta-, que él si sabe de este tema...).

En mi humilde opinión, lo que haría:
1.- Contar los registros.
2.- Sumaría +1 al valor de es contador.
3.- Luego asignaría más o menos así: "CODIGO-" + incremento.ToString("000")
Código: (VB) [Seleccionar]
Dim Sql As String = "Select Count(CODIGO) As Total From REPUESTOS"
Dim _total As Integer = 0
Dim Cmd As New FbCommand(Sql, Base)
Dim NuevoCodigo As String = "CODIGO-"
'//
_total = CType(FbCmd.ExecuteScalar, Integer)
NuevoCodigo = NuevoCodigo & _total.ToString("000")

Si existen en la Tabla "REPUESTOS" 35 registros (por ejemplo)...
El resultado de NuevoCodigo sería: "CODIGO-036" [por eso coloqué .ToString("000"), para formatear la salida]

Espero que esta si te pueda servir de algo...!!!

Saludos !!!


PD: Saludos, Ivan !!! Hermano !!!
       un abrazo !!!

Manuel F. Borrego Sterling 8)
Barcelona, Edo. Anzoátegui. Venezuela.
[Mientras nos permitan seguir comunicándonos...]
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

Luffy

  • Kilobyte
  • **
  • Mensajes: 90
  • Reputación: +4/-2
  • Desarrollar es el arte de crecer no de crear.
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #7 en: Octubre 19, 2016, 01:46:39 pm »


Te reitero, la instrucción COUNT() lo que hace es, 'contar' el número de registros que tienes en una tabla determinada, sin importar los valores que tengas almacenados en cada uno de ellos... A través de la variable _total.
La instrucción MAX(), te proporciona el valor más alto del campo que estés evaluando (en tu caso, Codigo), siempre y cuando dicho campo sea numérico, y creo que como lo estás planteando, tu campo debe ser del tipo String, por lo tanto la instrucción MAX() no te va a servir de nada (sino, que me corrija mi gran amigo y Gurú de FirebirdSQL, el gran Ivan -YAcosta-, que él si sabe de este tema...).

En mi humilde opinión, lo que haría:
1.- Contar los registros.
2.- Sumaría +1 al valor de es contador.
3.- Luego asignaría más o menos así: "CODIGO-" + incremento.ToString("000")
Código: (VB) [Seleccionar]
Dim Sql As String = "Select Count(CODIGO) As Total From REPUESTOS"
Dim _total As Integer = 0
Dim Cmd As New FbCommand(Sql, Base)
Dim NuevoCodigo As String = "CODIGO-"
'//
_total = CType(FbCmd.ExecuteScalar, Integer)
NuevoCodigo = NuevoCodigo & _total.ToString("000")


A mi humilde opinión eso es un error, por que si eliminas un registro determinado en algún momento vas a tener códigos repetidos. No se si me explico, ejemplo:

Tienes 36 registros el código que toca es el 37 por lo tanto sería "CÓDIGO-037"
pero si de los 36 borras el 4 solo te quedan 35 registros y cuando vuelvas a aplicar el count sumado el total de registros + 1 daria 36 nuevamente, lo que da como resultado "CÓDIGO-036" que ya existe.

Es un error a mi parecer, yo lo resolveria de la siguiente forma.

Creo una Tabla Contadores o como se llame en donde guardo un campo tipo integer, entero, int (Como sea que trabaje tu motor) una vez eso sucede creas un trigger en tu base de datos, si es FirebirdSQL tienes que preguntarle a YvanB definitivamente pero en MySQL seria algo asi:

Código: [Seleccionar]

DELIMITER $$

CREATE
    TRIGGER <NOMBRE DEL TRIGGER> AFTER INSERT
    ON <NOMBRE DE LA TABLA QUE LO VA A APLICAR>
    FOR EACH ROW BEGIN
DECLARE <NOMBRE DE LA VARIABLE> INT DEFAULT SELECT <CAMPO NUMERICO> FROM <TABLA CONTADOR>;
SET <NOMBRE DE LA VARIABLE> = <NOMBRE DE LA VARIABLE> + 1;
UPDATE <TABLA CONTADOR> SET <CAMPO NUMERICO> = <NOMBRE DE LA VARIABLE>;
NEW.<EL CAMPO CÓDIGO DE TU TABLA> = <NOMBRE DE LA VARIABLE>;
    END$$

DELIMITER ;


Esto hará lo siguiente:

  • Buscará el campo que creaste con el correlativo que toca
  • Una vez obtenido el campo le sumará 1
  • una vez establecida la suma, guarda el mismo campo en la misma tabla para mantenerla actualizada
  • Actualiza el campo de tu tabla donde quieres meter el código autonumérico
[li]
[/li][/list]

Es tal vez otra idea de hacerlo, pero puedes tener tu campo ID Autonumérico y con una columna calculada meterle la condicional y el formato.

Gracias.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:contador en vb.NET
« Respuesta #8 en: Octubre 20, 2016, 12:23:34 am »
Saludos amigos, hay tanto que comentar y tan poco tiempo jeje. Estimado Manuel estoy trabando en una empresa donde hay un compañero venezolano muy apreciable y me hizo recordar tu persona, te mando un fuerte abrazo amigo.

Bueno, yendo al tema.... me resisto a preguntar lo que de entrada debería preguntarte... ¿para que quieres esto? pero no lo preguntaré, debería preguntarte ¿esto obedece a una regla de negocio? (el querer controlar esta numeración) ¿porque mezclas la capa de presentación con el control de numeración?. Me desespera no poder preguntar porque muchas veces la forma correcta y sencilla de resolver esto es sabiendo para que se quiere hacer, pero bueno, me aguantaré y no preguntaré nada.

Lanzaré algunas pautas y quizá en alguna de ellas la chunte con lo que buscas.

Toda auto-numeración la puede (y debe) llevar el motor, no es necesario siempre hacer un +1 desde el aplicativo, si estas en Access puedes usar el seudo tipo de dato "autonumerico" y luego concatenarlo con algún string en tu capa de presentación, ese string puede estar en el código vb6 (mala idea) o puede estar en una tabla de prefijos donde no solamente tengas "CODIGO-" sino otras variantes que podrías usar según corresponda, en otras palabras dimensionarlo, no voy a profundizar en ello porque no se si eso es lo que quieres y no quiero tirar agua al mar.

Si estas en Firebird utilizarías un generador con un trigger (similar al de Luffy) que dicho en fácil es como simular un campo "auto-numérico" con la practicidad de que accedes y controlas ese código.

En Firebird también existen los campos calculados que son como campos virtuales donde nunca se inserta nada sino que su contenido es el resultado de otros campos y... hay caray y sigo ahondando... ya botenme!!!

Si insistes en hacerlo por el lado del aplicativo debes considerar lo que indica Luffy sobre los registros borrados, sin embargo aquí también debería considerarse evaluar el porqué querrías borrar los registros cuando bien podrías solo marcarlos con algún campo flag y facilitar la trazabilidad.

En lo que no te puedo ayudar casi nada es en la sintaxis .Net y creo que alli Manuelito te dio código que te puede servir.

Aun sueño con encontrar un post que diga: "Señores quiero hacer esto para resolver esto y se me ocurrio hacerlo de esta forma...."... seguiré esperando  :-)


Saludos
Me encuentras en YAcosta.com

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #9 en: Octubre 20, 2016, 08:10:12 pm »
Totalmente de acuerdo, lo mejor, más sencillo, y más seguro es dejar que la base maneje el auto numérico. Te olvidas de tener algún código repetido. Y de paso, este auto numérico te sirve de key de la tabla

ale_xi

  • Bytes
  • *
  • Mensajes: 30
  • Reputación: +3/-1
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #10 en: Octubre 20, 2016, 10:49:35 pm »
hola a todos, ya resolví ese tema, pero como recien estoy aprendiendo a programar vb.NET

Aca dejo por si le sirve a alguien.

Código: [Seleccionar]
   Dim Sql As String = "Select  max(CODIGO) +1 from REPUESTOS"
        Dim cmd As New OdbcCommand(Sql, Base)
        Dim codigo = cmd.ExecuteScalar
        If IsDBNull(codigo) Then
            Me.TeCodi.Text = "100"
        Else
            Me.TeCodi.Text = CStr(codigo)
        End If

Saludos a todos

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #11 en: Octubre 22, 2016, 02:25:54 pm »
Como habían dicho más arriba, que pasa si borran el último producto, luego viene otra persona y carga uno nuevo, va a haber dos productos con el mismo código

Luffy

  • Kilobyte
  • **
  • Mensajes: 90
  • Reputación: +4/-2
  • Desarrollar es el arte de crecer no de crear.
    • Ver Perfil
Re:contador en vb.NET
« Respuesta #12 en: Octubre 23, 2016, 07:03:52 pm »
Bueno nosotros nos encontramos con algo similar cuando manejamos varias empresas en una misma base de datos, un ejemplo muy claro es aquella empresa que pretende evadir un poco de taxes teniendo mas de una documentación fiscal.

Hay que llevar el Id normal de la identidad del registro y un ID correlativo que la toca a cada empresa.

Es un dolor de cabeza.