[SOLUCIONADO] Agregar Registro

Iniciado por VanHan, 19 Noviembre 2010, 20:33 PM

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

VanHan


Bueno como ven en la imágen, mi idea es añadir un separador en esas posiciones, donde estan las lineas en rojo.

  • Pero q es lo q pasa... Bueno si intentamos añadir los separadores en medio del codigo 3 y 4, al añadirlo y ordenarlo, se pondra abajo de el ultimo dato que tenga la fecha 08/07/2010, ¿pq? bueno porque esta ordenado por fechas el ListView, ahora si consulto, ¿cómo ariamos para ordenarlo en medio del codeigo 3  y 4 y q quede ordenado por fecha?

    Esto pasa cuando añado entre 3 y 4 un sepadador.


  • Aclaro q ordeno por la columna Fecha de Entrega

    DB click aquí para descaragar el ejemplo

    Gracias a todos por sus ayudas!!!

    Salu2
    [vHn]
.:: I'm GeeK ::.

BlackZeroX

#1
Agrega otro campo que relacione por categorias es decir

Para que quede asi:

Codigo | Producto |      Fecha        | Observacion
     1         Prod.1       25/09/2010        Ninguna
     2         Prod.2       25/09/2010        Ninguna   
     3         Prod.3       25/09/2010        Reservado
     5       =======   25/09/2010       ========
     4         Prod.4       26/09/2010        Ninguna

Deberas agregar otro campo en tu BDD  como es: Agrupacion

Codigo | Producto |      Fecha        | Observacion    |  Agrupacion
     1         Prod.1       25/09/2010        Ninguna                1
     2         Prod.2       25/09/2010        Ninguna                1
     3         Prod.3       25/09/2010        Reservado             1
     5       =======   25/09/2010       ========               0
     4         Prod.4       26/09/2010        Ninguna                 2

Obviamente en agrupacion pones numeros para que te sea factible lo que pides, y en el ListView o DataGrid o sepa Chachito donde los imprimas, No imprimes hay dicho campo solo te ayudaria a ti en lo que deseas.

Es una forma basica y simple, en mi caso no agregaria dicha linea separador por espacio en la BDD aun que hay otra obtativa y es esta:

Creas una tabla de configuracion

ID   |   Range
0         1-5,8
1         6,7,10-20
...
N        {N,N2,Nx-Nn}

* Es decir que los registro desde 1 hasta 5 y 8,  son un grupo
* El siguiente registro es decir 6,7,10 hasta el 20 es otro grupo

Es decir: Cada registro es un grupo y estaria delimitado por tu linea que deberas programar por codigo mas no registrar en la BDD por que seria BASURA, en una BDD gorda de datos este metodo es mas factible que el 1ero, por su simplicidad y reduccion de datos en la misma.

OJO PRECAUCIÓN: Este metodo de relacion de uno a muchos o muchos a muchos, asi que tu codigo de registro debera ser de precision de lo contrario crearas relaciones de muchos a muchos si es que no tienes delimitado tus bases, la ventaja que es Maniobrable /Dinamico la Desventaja que si usas PL/SQL seria mejor usar la 1ra optativa...

* Donde el campo Range es un campo tipo string que dice de forma simplificada un rango dicho:

Puedes usar esta funcion para generar dichos rangos;

GetSimplificNumbers

[SRC] Abbreviate_Numeric_Array [by *PsYkE1] <-- Trae la funcion para desabreviar = sirve para mi funcion ya que lo rete a hacer dicha funcion de simplificación.

Ojo si usas este 2da alternativa entonces el campo Agrupacion de la 1ra solucion se desecharia...

Cabe mencionar que esta segunda forma es mas liviana para la BDD y no ocuparia tanto espacio y eso es lo que se busca en una BDD la primera tiene patrones que se pueden omitir con este 2do metodo.

P.D.: lo siento por las faltas de ortografia xP.

Sangriento Infierno Lunar!¡.
The Dark Shadow is my passion.

Psyke1

#2
.
Vhn puedes utilizar mi clase cCollectionEx.cls; te puede ser útil para comprobar elementos repetidos y demás... (si es que lo necesitas)
Black, creo que ahora te gano ::)

Añadir mi clase cCollectionEx.cls

Pego el codigo :
Código (vb) [Seleccionar]

'=========================================================
' º Function : Abbreviate_Numeric_Array
' º Author   : Mr. Frog ©
' º Mail     : vbpsyke1@mixmail.com
' º Recommended Websites :
'       http://blog.visual-coders.com.ar/
'       http://InfrAngeluX.Sytes.Net/
'=========================================================
Option Explicit
Option Base 0

Rem Añadir mi clase cCollectionEx.cls

Public Function Abbreviate_Numeric_Array(ByRef vNumberList() As Variant) As cCollectionEx
If (Not vNumberList) = -1 Then Exit Function
Dim cExTemp                                         As New cCollectionEx
Dim lActualNumber                                   As Variant
Dim lToTalNumbers                                   As Long
Dim Q                                               As Long
Dim W                                               As Long
   lToTalNumbers = UBound(vNumberList())
   If lToTalNumbers > 2 Then
       Do While Q <= lToTalNumbers
           lActualNumber = vNumberList(Q)
           W = 0
           If (Q < lToTalNumbers) Then
               Do While (vNumberList(Q) + 1 = vNumberList(Q + 1)) Or _
                        (vNumberList(Q) = vNumberList(Q + 1))
                   Q = Q + 1
                   W = W + 1
               Loop
           End If
           With cExTemp
               If W > 1 Then
                   .Add lActualNumber & "~" & vNumberList(Q)
               Else
                   .Add lActualNumber
               End If
           End With
           If Not (W = 1) Then Q = Q + 1
       Loop
       Set Abbreviate_Numeric_Array = cExTemp
   End If
End Function


Ejemplo:

Código (vb) [Seleccionar]

Private Sub Form_Load()
Dim Q                                   As Long
Dim dArray()                            As Variant
Dim sResult                             As String

   dArray() = Array(1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 65, 345, 4545, 4546, 4547, 9999999, 9999999999#)
   
   With Abbreviate_Numeric_Array(dArray)
       For Q = 1 To .Count
           sResult = sResult & .Item(Q) & "|"
       Next Q
   End With
   
   Debug.Print sResult
End Sub


Obtengo esto:
Citar
1~7|65|345|4545~4547|9999999|9999999999|


Vhn conectate al msn cuando puedas, tengo que hablar contigo... :-*

DoEvents! :P
.

BlackZeroX

#3
Cita de: Mr. Frog © en 20 Noviembre 2010, 16:21 PM
.
Vhn puedes utilizar mi clase cCollectionEx.cls; te puede ser útil para comprobar elementos repetidos y demás... (si es que lo necesitas)
Black, creo que ahora te gano ::)


Mi codigo verifica elementos repetidos sin tu clase... ¬¬" que no te has fijado en eso?... ademas tiene la optativa de ordenar el arreglo. ¬¬", lo bueno te tu funcion es que hace corrovoracion de muchos a muchos con este problema, lo malo de la mia es que no lo hace asi, es decir esta secuencia  2,2,2,3,2,2

Corregido ahora si lo hacepta solo era agregar Or Lng_ResNumber& < 0 en:


Código (vb,20) [Seleccionar]


Public Function GetSimplificNumbers(ByRef ArrayOfNumbers() As Variant) As String()
If (Not ArrayOfNumbers) = -1 Then Exit Function     '   //  Array entrante, inicializado?.
Dim Lng_ArrayTmp$()                                 '   //  Colección de Números Simplificados!¡.
Dim Lng_Ini&, Lng_End&, Lng_Index&                  '   //  Variables para el Bucle.
Dim Lng_AntPosNumber&                               '   //  Indice del Numero anterior (Numero del Array entrante).
Dim Lng_ResNumber&                                  '   //  residuo de Lng_Index& - Lng_AntPosNumber&.
Dim Lng_ArrayCount&                                 '   //  Contador de las dimensiones de Lng_ArrayTmp$.
Dim Bool_Swith                  As Boolean          '   //  swith para saber si se debe simplificar!¡.

    'Call Start_QuickSort(ArrayOfNumbers(), AcendetOrder)    '   //  http://infrangelux.sytes.net/Blog/index.php?option=com_content&view=article&id=14:artquicksortybublesort&catid=2:catprocmanager&Itemid=8
   
    Lng_Ini = LBound(ArrayOfNumbers):   Lng_End = UBound(ArrayOfNumbers)
    If Not isnumber(ArrayOfNumbers(Lng_Ini)) Then Exit Function
    ReDim Lng_ArrayTmp$(Lng_ArrayCount&)
    Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index&)

    For Lng_Index& = Lng_Ini + 1 To Lng_End
        Lng_ResNumber& = ArrayOfNumbers(Lng_Index&) - ArrayOfNumbers(Lng_Index& - 1)
        If Lng_ResNumber& > 1 Then








CitaGetSimplificNumbers



Solo es un simple algoritmo para simplificación de números en un array!¡.



la idea es ingresar números y qué los Simplifique, es decir 1,2,3,4,5,9,10,15,16,17,18,555,342,423,422 los ordena de la siguiente manera:

1~5,9,10,15~18,555,342,423,422

Código (Vb) [Seleccionar]


Private Sub Form_Load()
Dim arr()               As Variant
Dim Element             As Variant
    arr() = Array(1, 2, 2, 2, 3, 3, 3, 5, 5, 3, 3, 9, 10, 10, 10, 10, 11, 12, 12, 13, 15, 16, 17, 18, 555, 342, 423, 422, 415, 416, 417)
    For Each Element In GetSimplificNumbers(arr())
        Debug.Print Element
    Next
End Sub



Código (vb,32) [Seleccionar]

'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Código siempre y cuando   //
'   // no se eliminen los créditos originales de este código   //
'   // No importando qué sea modificado/editado o engrandecido //
'   // o achicado, si es en base a este código                 //
'   /////////////////////////////////////////////////////////////
Option Explicit

Public Function GetSimplificNumbers(ByRef ArrayOfNumbers() As Variant) As String()
If (Not ArrayOfNumbers) = -1 Then Exit Function     '   //  Array entrante, inicializado?.
Dim Lng_ArrayTmp$()                                 '   //  Colección de Números Simplificados!¡.
Dim Lng_Ini&, Lng_End&, Lng_Index&                  '   //  Variables para el Bucle.
Dim Lng_AntPosNumber&                               '   //  Indice del Numero anterior (Numero del Array entrante).
Dim Lng_ResNumber&                                  '   //  residuo de Lng_Index& - Lng_AntPosNumber&.
Dim Lng_ArrayCount&                                 '   //  Contador de las dimensiones de Lng_ArrayTmp$.
Dim Bool_Swith                  As Boolean          '   //  swith para saber si se debe simplificar!¡.

    'Call Start_QuickSort(ArrayOfNumbers(), AcendetOrder)    '   //  http://infrangelux.sytes.net/Blog/index.php?option=com_content&view=article&id=14:artquicksortybublesort&catid=2:catprocmanager&Itemid=8
   
    Lng_Ini = LBound(ArrayOfNumbers):   Lng_End = UBound(ArrayOfNumbers)
    If Not isnumber(ArrayOfNumbers(Lng_Ini)) Then Exit Function
    ReDim Lng_ArrayTmp$(Lng_ArrayCount&)
    Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index&)

    For Lng_Index& = Lng_Ini + 1 To Lng_End
        Lng_ResNumber& = ArrayOfNumbers(Lng_Index&) - ArrayOfNumbers(Lng_Index& - 1)
        If Lng_ResNumber& > 1 Or Lng_ResNumber& < 0 Then
            If Bool_Swith Then
                If Lng_AntPosNumber& > 2 Then
                    Lng_ArrayTmp$(Lng_ArrayCount&) = Lng_ArrayTmp$(Lng_ArrayCount&) & "~" & ArrayOfNumbers(Lng_Index& - 1)
                Else
                    Lng_ArrayCount& = Lng_ArrayCount& + 1
                    ReDim Preserve Lng_ArrayTmp$(Lng_ArrayCount&)
                    Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index& - 1)
                End If
            End If
            Lng_ArrayCount& = Lng_ArrayCount& + 1
            ReDim Preserve Lng_ArrayTmp$(Lng_ArrayCount&)
            Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index&)
            Bool_Swith = False
        ElseIf Lng_ResNumber& = 1 Then
            If Not Bool_Swith Then Lng_AntPosNumber& = 0
            Bool_Swith = True
            If Lng_Index& = Lng_End Then
                If Conversion.CBool(InStr(1, Lng_ArrayTmp$(Lng_ArrayCount& - 1), "~")) Then
                    Lng_ArrayCount& = Lng_ArrayCount& + 1
                    ReDim Preserve Lng_ArrayTmp$(Lng_ArrayCount&)
                    Lng_ArrayTmp$(Lng_ArrayCount&) = ArrayOfNumbers(Lng_Index&)
                Else
                    Lng_ArrayTmp$(Lng_ArrayCount&) = Lng_ArrayTmp$(Lng_ArrayCount&) & "~" & ArrayOfNumbers(Lng_Index&)
                End If
            Else
                Lng_AntPosNumber& = Lng_AntPosNumber& + 1
            End If
        ElseIf Lng_ResNumber& = 0 Then
            If Lng_AntPosNumber& > 0 Then
                Lng_AntPosNumber& = Lng_AntPosNumber& + 1
            Else
                Lng_AntPosNumber& = 0
            End If
        End If
    Next
    GetSimplificNumbers = Lng_ArrayTmp$
End Function



Dulces Lunas!¡.
The Dark Shadow is my passion.

VanHan

#4
Gracias BlackZeroX▓▓▒▒░░  y Mr. Frog actualice el Post asi ven lo que intento hacer.

Salu2
[vHn]
.:: I'm GeeK ::.