Ordenación de dataset en vb .net

A veces lo que debería ser sencillo se nos complica ya sea por limitación técnica del proyecto, olvido o cualquier otro motivo.

Dejo aquí un ejemplo de VB .NET en el cual al pulsar un botón, se crea de manera dinámica un dataset con una tabla que contiene una única columna. Se rellena introduciendo del 0 al 100 y posteriormente se ordena la tabla del dataset del 100 al 0.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'creamos dataset
    Dim midataset As New DataSet
    midataset.Tables.Add("TABLA")

    'Creo un tipo columna al cual le indico que es integer
    Dim colindice As New DataColumn("INDICE", GetType(Integer))

    'Añado la columna creada previamente
    midataset.Tables("TABLA").Columns.Add(colindice)

    'rellenamos dataset
    For I = 0 To 100
        Dim lineaainsertar As DataRow = midataset.Tables("TABLA").NewRow
        lineaainsertar.Item("INDICE") = I
        midataset.Tables("TABLA").Rows.Add(lineaainsertar)
    Next

    'Ordenar dataset
    'Creo una vista y la ordeno
    Dim vista As New DataView(midataset.Tables("TABLA"))
    vista.Sort = "INDICE DESC"

    'Creo una datatable donde volcar ordenado el contenido de la vista
    Dim datatatabletemp As DataTable
    datatatabletemp = vista.ToTable


    'Vacio la tabla sel dataset y la lleno con los datos del datatable.
    midataset.Tables("TABLA").Clear()
    midataset.Tables("TABLA").Merge(datatatabletemp)
    midataset.Tables("TABLA").AcceptChanges()


    'Muestro el primer valor de la tabla TABLA del dataset
    MessageBox.Show(midataset.Tables("TABLA").Rows(0).Item("INDICE"))


End Sub

Por cierto, al parecer el otro visor de plugin que usaba para mostrar código ha dejado de funcionar, así que he pasado a Enlighter. Veremos que tal va.

Ejemplo de Dataset en vb.net

Es un pequeño ejemplo de como crear, rellenar y leer un dataset con dos tablas y una columna en cada tabla, en vb.net.

Creo que la manera más sencilla de ejecutarlo, sería crear una ventana en vb.net, agregar un botón y en el evento _click del mismo, insertar el código de abajo.

Básicamente el código crea un dataset, inserta una tabla en él y posteriormente una columna en esa tabla. Para luego mediante un bucle insertar varias líneas en dicha tabla y posteriormente leerlo.

Para mostrar que un dataset puede tener varias tablas, lo que hacemos es crear una nueva tabla en el mismo dataset, con otra columna, insertar líneas y leerlas.

Recordar que en programación algo se puede hacer de muchas maneras, y muchas veces la necesidad de cada uno, hará que una forma u otra sea la más apropiada.

Además, aprovechamos esta entrada para probar el plugin CodeMirror Blocks para insertar código. Es un plugin de wordpress desarrollado por Vicky Agravat que permite embeber código dentro de la página mostrándolo dentro de un editor de código.

El anterior Plugin ha dejado de funcionar, por lo que he cambiado a Enlighter de Andi Dittrich

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'EJEMPLO DE DATASET INDEPENDIENTE DE BASE DE DATOS, CREADO DINAMICAMENTE. DE COMO SE PUEDE RELLENAR Y COMO SE PUEDE RECORRER
    MessageBox.Show("EJEMPLO DE DATASET INDEPENDIENTE DE BASE DE DATOS, CREADO DINAMICAMENTE. DE COMO SE PUEDE RELLENAR Y COMO SE PUEDE RECORRER")
    'creacion de un dataset con una tabla llamada tabla que contiene una columna llamada columna
    Dim midataset As New DataSet
    midataset.Tables.Add("TABLA") 'Inserccion de una tabla llamada TABLA en midataset
    midataset.Tables("TABLA").Columns.Add("COLUMNA") 'Inserccion de una columna llamada "COLUMNA en la tabla "TABLA" de midataset
    'cargamos el dataset con datos, en este caso hacemos un bucle de 1 a 5 y metemos el valor
    For iaux As Integer = 1 To 5
        Dim lineaainsertar As DataRow = midataset.Tables("TABLA").NewRow
        lineaainsertar.Item("COLUMNA") = iaux  'introduccion de datos en lineaainsertar
        midataset.Tables("TABLA").Rows.Add(lineaainsertar) 'inserccion de lineaainsertar en la tabla "TABLA" de midataset
    Next
    'recorremos la tabla del dataset y mostramos los datos
    For Each leolineadataset As DataRow In midataset.Tables("TABLA").Rows()
        MessageBox.Show(leolineadataset("COLUMNA").ToString)
    Next
    midataset.Tables.Add("OTRATABLA") 'Inserccion de una tabla llamada OTRATABLA en midataset
    midataset.Tables("OTRATABLA").Columns.Add("OTRACOLUMNA") 'Inserccion de una columna llamada "OTRACOLUMNA en la tabla "TABLA" de midataset
    'cargamos el dataset con datos, en este caso hacemos un bucle de 50 a 60 y metemos el valor
    For iaux As Integer = 50 To 60
        Dim lineaainsertar As DataRow = midataset.Tables("OTRATABLA").NewRow
        lineaainsertar.Item("OTRACOLUMNA") = iaux  'introduccion de datos en lineaainsertar
        midataset.Tables("OTRATABLA").Rows.Add(lineaainsertar) 'inserccion de lineaainsertar en la tabla "OTRATABLA" de midataset
    Next
    'recorremos la tabla del dataset y mostramos los datos
    For Each leolineadataset As DataRow In midataset.Tables("OTRATABLA").Rows()
        MessageBox.Show(leolineadataset("OTRACOLUMNA").ToString)
    Next
    'PON UNPUNTO DE INTERRUPCION EN LA LINEA DEL MENSAJE DE FIN Y MIRA LA LUPA EN MIDATASET
    MessageBox.Show("FIN")
End Sub

Generador de Cif en plsql. v1.0

Recientemente me he encontrado en la necesidad de generar miles de cif de manera aleatoria, pero que fueran válidos.

Navegando por internet encontré la explicación del cálculo que se realiza para la generación de cif en esta web https://definanzas.com/cif-o-el-codigo-de-identificacion-fiscal-calcular-y-comprobar-diferencias-con-el-nif/#Letra_o_numero_de_control_Letra_C así que decidí hacerme un pequeño plsql para generar cif.

Esta es la versión 1.0 de dicho programa, se podría mejorar y completar. Actualmente este código genera un número de cif, compuesto por un codigo de provincia fijo, al cual se le añade de manera aleatoria una cadena de 5 números y a partir de la cual se calcula el digito de control.

Al número resultante, habría que añadirle una de las letras a elegir entre A,B,E o H.

Para entender el código, recomiendo leer antes el enlace indicado anteriormente.


-- Calculo de cif aleatorios
SET serveroutput ON;
declare
codigoprovincia varchar2(12) := '';
listadoletras varchar2(50) := '';
letra varchar2(10) := '';
digitocontrol integer := 0;
numerointermedio integer := 0;
ciffinal varchar2(20) := '';
controlpares integer := 0;
controlimpares integer := 0;
auximpares integer := 0;

begin
codigoprovincia := '57';

select (dbms_random.value(10000,99999)) into numerointermedio from dual;
numerointermedio := to_number(codigoprovincia || numerointermedio);
dbms_output.put_line('NUMERO: ' || numerointermedio);
controlpares := to_number(substr(numerointermedio,2,1)) + to_number(substr(numerointermedio,4,1)) + to_number(substr(numerointermedio,6,1));
dbms_output.put_line('SUMATORIO PARES: ' || controlpares);

auximpares := to_number(substr(numerointermedio,1,1)) * 2 ;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

auximpares := to_number(substr(numerointermedio,3,1)) * 2;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

auximpares := to_number(substr(numerointermedio,5,1)) * 2;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

auximpares := to_number(substr(numerointermedio,7,1)) * 2;
if auximpares >= 10 then
auximpares := to_number(substr(auximpares,1,1)) + to_number(substr(auximpares,2,1));
end if;
controlimpares := controlimpares + auximpares;

dbms_output.put_line('SUMATORIO IMPARES: ' || controlimpares);

dbms_output.put_line('sumatorio controlpares + controlimpares: ' || (controlpares + controlimpares));
dbms_output.put_line('ultimo digito del sumatorio: ' || to_number(substr((controlpares + controlimpares),2,1)));
digitocontrol := 10 - to_number(substr((controlpares + controlimpares),2,1));
dbms_output.put_line('DIGITO CONTROL: ' || digitocontrol);
ciffinal := letra ||numerointermedio || digitocontrol;
dbms_output.put_line(ciffinal);
end;

as of timestamp timestamp . Un pequeño salvavidas.

Agregando as of timestamp timestamp a una query, podremos obtener los resultados que daría esa select contra esa tabla en el momento que indicamos. El espacio de tiempo que podremos consultar, viene dado por el parámetro de la base de datos undo_retention, que por defecto tiene 900 segundos.

select * from nombre_de_la_tabla as of timestamp timestamp '2016-12-07 15:00:00'

Un ejemplo muy claro del uso del mismo sería recuperar la información de una tabla en la que hubiéramos actualizado o borrado líneas accidentalmente.

Aqui hay más información sobre Undo_retention
Aqui Aqui hay más información sobre as of timestamp timestamp