https://foro.gambas-es.org/viewtopic.php?f=3&t=4618
-----------------------------------
v3ctor
Viernes, 15 May 2015, 19:58

Como Detectar Primary Key En Tabla?
-----------------------------------
buenas, en el programa infodatabasesql quiero agregarle que muestre si el campo seleccionado es primary key o no.

e buscado y no he tenido resultados, tampoco se como funciona bien table.primarykey

alguna orientación?


-----------------------------------
shordi
Viernes, 15 May 2015, 21:12

Re: Como Detectar Primary Key En Tabla?
-----------------------------------
Table.Primarykey te devuelve un string[] con los nombres e los campos que forman la clave primaria.
Sencillo.

 :mryellow:  :mryellow:


-----------------------------------
v3ctor
Viernes, 15 May 2015, 21:52

Re: Como Detectar Primary Key En Tabla?
-----------------------------------
[quote user="shordi" post="26476"]Table.Primarykey te devuelve un string[] con los nombres e los campos que forman la clave primaria.
Sencillo.

 :mryellow:  :mryellow:[/quote]

jajaj que burro soy no me daba cuenta, yo creia que devolvia un string(sinceramente falta info en las ayudas por esto me pasa esto)

 [img]http://foro.gambas-es.org/files/images/2261/5511.png[/img] 

 Dim campo As Field
  Dim tabla As Table
  [b][color=#FF0000]Dim CamposPK As String[][/color][/b]
  [b][color=#FF003F]Dim NomCampo As String[/color][/b]
  
  QueTablas = ListaCampos.Current.Text
  SentenciaSQL = "select " & QueTablas & " from " & NombreTabla 
  txtSql.Text = SentenciaSQL
  
  For Each tabla In Conexion.Tables
       If tabla.Name = NombreTabla Then
        [b][color=#FF0026] CamposPK = tabla.PrimaryKey
         For Each NomCampo In CamposPK
           Print NomCampo
         Next[/color][/b]
         For Each campo In tabla.Fields
           
                     
           If campo.Name = ListaCampos.Current.Text Then
              ' campo.Type
              LabLargo.Text = "Largo: " & campo.Length
              typeEs(campo.Type)
              
           Endif
        Next
     Endif
  Next
  
End

que te parece el codigo que agregue shordi?

toy salao programando  :razz:  

 :lol: 
 :cool:  :cool:  :cool:  :cool:  :cool:


-----------------------------------
v3ctor
Viernes, 15 May 2015, 22:17

Re: Como Detectar Primary Key En Tabla?
-----------------------------------
al final quedo asi mostrando un icono cuando es primary key


Public Sub RegistrosCampos()
  Dim campo As Field
  Dim tabla As Table
  [b][color=#00FF7F]Dim CamposPK As String[]
  Dim NomCampo As String[/color][/b]
  
  QueTablas = ListaCampos.Current.Text
  SentenciaSQL = "select " & QueTablas & " from " & NombreTabla 
  txtSql.Text = SentenciaSQL
  
  For Each tabla In Conexion.Tables
       If tabla.Name = NombreTabla Then
         [b][color=#00FF72]CamposPK = tabla.PrimaryKey[/color][/b]
         For Each campo In tabla.Fields
           If campo.Name = ListaCampos.Current.Text Then
              [b][color=#00FF3F] For Each NomCampo In CamposPK
                 If NomCampo = campo.Name Then
                    PicbPK.Visible = True
                 Else
                    PicbPK.Visible = False
                 Endif[/color][/b]
               Next
              LabLargo.Text = "Largo: " & campo.Length
              typeEs(campo.Type)
              
           Endif
        Next
     Endif
  Next
  
End


 [img]http://foro.gambas-es.org/files/images/2261/9988.png[/img]

Print tabla.PrimaryKey   cuando puse esto y me dio este resultado:

([b][color=#E50000]String[][/color][/b] 0xa405fa4)

era obvio que retornaba un string[]  y no un string  (un array de cadena y no una cadena)

pero no me daba cuenta jajaj :roll:


-----------------------------------
shordi
Sabado, 16 May 2015, 10:10

Re: Como Detectar Primary Key En Tabla?
-----------------------------------
Tepongo unos comentarios:

[code linenumbers=false syntax=gambas]
Public Sub RegistrosCampos()  'Èsta función supongo que se dispara al hacer click en el la lista de campos
  Dim campo As Field
  Dim tabla As Table
  Dim CamposPK As String[]
  Dim NomCampo As String
  
  QueTablas = ListaCampos.Current.Text  'Quetablas supongo que es una variable privada. No la necesitas, que ya tienes el valor del control listacampos (a parte de eso el nombre es confuso QueCampo sería más correcto)
  SentenciaSQL = "select " & QueTablas & " from " & NombreTabla  ' Esto es precipitado. con ello sólo puedes hacer una consulta de un solo campo. Deberías coleccionar primero todos los campos que el usuario quiere ver antes de construir la sentencia
  txtSql.Text = SentenciaSQL
  
  For Each tabla In Conexion.Tables  '¿para qué recorrer todas las tablas si ya sabemos de cuál estamos hablando?
       If tabla.Name = NombreTabla Then  
         CamposPK = tabla.PrimaryKey  '¿para qué crear una variable que contiene información que ya tenemos?
         For Each campo In tabla.Fields  '¿Para qué recorrer todos los campos... etc. etc.?
         
        If campo.Name = ListaCampos.Current.Text Then
               For Each NomCampo In CamposPK     'desde aquí....
                 If NomCampo = campo.Name Then
                    PicbPK.Visible = True
                 Else
                    PicbPK.Visible = False
                 Endif
               Next                                                'hasta aquí, es demasiado código para cosas que el lenguaje ya te da resueltas
              LabLargo.Text = "Largo: " & campo.Length
              typeEs(campo.Type)
              
           Endif
        Next
     Endif
  Next
  
End

[/code]
En resumen, la función que te pone el largo, el tipo y el icono si es clave primaria, podría quedar así:

[code linenumbers=false syntax=gambas]

Public Sub RegistrosCampos()

  PicbPK.visible= (conexion.tables[listatablas.current.text].primarykey.find(listacampos.current.text) > -1) 
  LabLargo.Text = "Largo: " & campo.Length
  typeEs(campo.Type)

end
[/code]
Más aún, yo la eliminaría por completo y pondría en el evento click de listacampos las tres líneas de código. Luego, una vez que tuviese claro qué campos, no sólo uno, quiero ver en la ejecución de la sentencia SQL crearía la sentencia y la ejecutaría.


-----------------------------------
shordi
Sabado, 16 May 2015, 10:17

Re: Como Detectar Primary Key En Tabla?
-----------------------------------
Aclarar aquí, que yo, cuando me enfrento a un problema así, primero hago cosas como las que tú has hecho. Lo llamo "Diseccionar" el problema, y lo divido en tantas partes y con tantas redundancias como tú lo has hecho. Luego, una vez que funciona viene la labor de poda y optimización que, por un lado es una maravilla (¡mira he reducido 100 líneas a sólo 10!) y por otro una depresión (¡Toda la mañana trabajando para al final haber escrito sólo 10 líneas!)... pero es lo que hay.

Lo más difícil de todo es la simpleza, la concisión y la pulcritud del código. 

Lo más importante es que funcione. Si el tuyo funciona, es válido... el nivel de exigencia de todo lo demás lo marcas tú.

Saludos


-----------------------------------
v3ctor
Sabado, 16 May 2015, 14:09

Re: Como Detectar Primary Key En Tabla?
-----------------------------------
Excelente aporte shordi, excelentes conceptos, muy instructivo.

el código es de un aprendiz, el objetivo mio siempre es comprender como funcionan las clases, en este caso todo lo referido a clases sobre bases de datos
como ser la clase table, field etc. 

jaja si supieran el motivo por el cual me inspire para hacer un programa que te mostrara la estructura y datos de una base sqlite.

el motivo fue que cuando hacia pruebas de crear tablas en gambas y quería corregirlas no podía obtener la sentencia para copiarla y pegarla del gambas
de la tabla maestra sqlite_master. Buen podría guardar la sentencia en un txt antes de ejecutarla pero en fin ese fue el motivo por el cual estoy programando infodatabasesql. 

estoy metido de lleno en base de datos sqlite para poder hacer el programa del taller a medida y cumpla con todas mis necesidades.
también me doy cuenta que saber sobre base de datos es casi imprescindible para un programador pues casi todo programa necesita una base de datos de algo.


