[Risolto] Grid control con dati filtrati

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Luka2017
Messaggi: 67
Iscritto il: giovedì 16 febbraio 2017, 11:59

[Risolto] Grid control con dati filtrati

Messaggio da Luka2017 »

Buongiorno
avrei necessità tramite la formula che vi allego, la possibilità di inserire all'interno del grid control i dati filtrati presenti in un foglio. Il problema che mi appare nella grid control solamente i dati filtrati presenti nella colonna "A" e non i dati presenti nelle colonne successive. Mi potete Aiutare? Grazie mille.

Codice: Seleziona tutto

Sub Grid_stand
Dim oCell
Dim oFilterDesc
Dim oTextBox
Dim Arr
dlgmodel = oDialogo11.getModel()
gridmodel = dlgmodel.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
with gridmodel
.PositionX = 352
.PositionY = 35
.Width = 178
.Height = 172
end with  
  ' add columns
  columnmodel = gridmodel.ColumnModel
  
  col = columnmodel.createColumn()
  col.Title = "STAND"
  columnmodel.addColumn(col)
  
  col = columnmodel.createColumn()
  col.Title = "ID. COD."
  columnmodel.addColumn(col)
  
  col = columnmodel.createColumn()
  col.Title = "DESCRIZIONE"
  columnmodel.addColumn(col)
  
  col = columnmodel.createColumn()
  col.Title = "Q.TA'"
  columnmodel.addColumn(col)
If oDialogo11.getControl("TextField1").text <>"" Then
 dlgmodel.insertByName("grid", gridmodel)
  grid = oDialogo11.getControl("grid")
  oListener = (CreateUnoListener("grid_", "com.sun.star.awt.grid.XGridSelectionListener"))
grid.addSelectionListener(oListener)
datamodel = gridmodel.GridDataModel
Dim oFields(0) As New com.sun.star.sheet.TableFilterField2
Sheet = ThisComponent.Sheets(1)
oTextBox = oDialogo11.getControl("TextField1")
Daric = UCase(oTextBox.Text)
c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
oFilterDesc = CellRange.createFilterDescriptor(True)
  With oFields(0)
      .Field = 0
      .Operator = com.sun.star.sheet.FilterOperator2.BEGINS_WITH
      .StringValue = Daric
  End With
oFilterDesc = CellRange.createFilterDescriptor(True)
With oFilterDesc
    .ContainsHeader = False
    .CopyOutputData = False
    .FilterFields2 = oFields()    
End With
CellRange.filter(oFilterDesc)
ranges = CellRange.queryVisibleCells()
If Ubound(ranges.RowDescriptions) > -1 Then 
  ReDim Arr(0 To Ubound(ranges.RowDescriptions))
  Dim a(0 To Ubound(ranges.RowDescriptions))
  For Each oCell in ranges.Cells
        Arr(x) = oCell.CellAddress.Row 
       a(x) = oCell.DataArray(0)
       x = x +1
  Next
  datamodel.addRows(a, a)
End if
End if
End Sub
Ultima modifica di Luka2017 il lunedì 9 maggio 2022, 9:45, modificato 1 volta in totale.
Open office 3.1 Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Grid control con dati filtrati

Messaggio da patel »

Allega un file di esempio.
Non hai allegato una "formula" ma una MACRO
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Luka2017
Messaggi: 67
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: Grid control con dati filtrati

Messaggio da Luka2017 »

Buongiorno scusa il ritardo e invece di scrivere macro ho scritto formula. In allegato ti inserisco il file.

Grazie Mille
Allegati
test grid.ods
(16.12 KiB) Scaricato 79 volte
Open office 3.1 Windows 7
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8819
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Grid control con dati filtrati

Messaggio da charlie »

Rilancio.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Grid control con dati filtrati

Messaggio da geovign »

Ciao Luka2017,
nella macro Sub Fitro_grid , sostituisci le righe

Codice: Seleziona tutto

For Each oCell in ranges.Cells
Arr(x) = oCell.CellAddress.Row
a(x) = oCell.DataArray(0)
x = x +1
Next
con

Codice: Seleziona tutto

For Each oCell in ranges.Cells
Arr(x) = oCell.CellAddress.Row
oRiga = Sheet.getRows.getByIndex(Arr(x))
a(x) = oRiga.DataArray(0)
x = x +1
Next
Il resto non cambia.
Saluti.
Geo
LibO 7 su LinuxMint 21
Luka2017
Messaggi: 67
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: Grid control con dati filtrati

Messaggio da Luka2017 »

Ciao Geo domani pomeriggio ci provo perché sono fuori. Sono certo che funziona e ti darò riscontro. Grazie mille :super:
Open office 3.1 Windows 7
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Grid control con dati filtrati

Messaggio da unlucky83 »

Codice: Seleziona tutto

For Each oCell in ranges.Cells
        Arr(x) = oCell.CellAddress.Row
       a(x) = Sheet.getcellrangebyposition(0,Arr(x),4,Arr(x)).DataArray(0)
       x = x +1
  Next
Prova allegato
Allegati
test grid.ods
(27.19 KiB) Scaricato 70 volte
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Luka2017
Messaggi: 67
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: Grid control con dati filtrati

Messaggio da Luka2017 »

Ho provato e funziona benissimo. Un ultima cosa e non disturbo più. Spero!

Come faccio a far apparire nel textbox2 il nome della riga che ho selezionato?

Ti allego il file

Grazie Mille ;)
Allegati
test grid.ods
(23.06 KiB) Scaricato 69 volte
Open office 3.1 Windows 7
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Grid control con dati filtrati

Messaggio da unlucky83 »

Non ho soddisfatto la tua richiesta a pieno.
Hai bisogno di aggiungere una macro per il listener che stai adoperando, quindi ti serve come minimo

Codice: Seleziona tutto

Sub grid_selectionChanged(oEvt)
...
End Sub
Visto che nel Dialog2 non esiste nessun oggetto di nome textbox2, ho preferito prepararti la seguente macro che è un punto di partenza utile per capire come popolare i campi che desidererai riempire. In un msgbox ho inserito i richiami ai vari campi della riga selezionata

Codice: Seleziona tutto

Sub grid_selectionChanged(oEvt)
dim indice
indice=oEvt.Source.CurrentRow
row_selected=datamodel.GetRowData(indice)
MsgBox "selected row: " & indice & chr(13) & "Cognome: " & row_selected(0) & chr(13) & "Nome: " & row_selected(1) & chr(13) & "Cod: " & row_selected(2) & chr(13) & "Descrizione: " & row_selected(3) & chr(13) &"Qtà: " & row_selected(4) 
End Sub
Allego esempio
Allegati
test grid.ods
(27.35 KiB) Scaricato 70 volte
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Grid control con dati filtrati

Messaggio da geovign »

Al quesito originale, hai invece risposto pienamente.
Luka2017 ha successivamente "integrato" il quesito con una nuova richiesta.
Saluti
Geo
LibO 7 su LinuxMint 21
Luka2017
Messaggi: 67
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: Grid control con dati filtrati

Messaggio da Luka2017 »

Grazie comunque ho risolto con questa macro.

Codice: Seleziona tutto

Sub grid_selectionChanged(oEvt)
indice=oEvt.Source.CurrentRow
row_selected=datamodel.GetRowData(indice)
oDialogo16.getControl("TextField1").Text = row_selected(1)
End Sub
Open office 3.1 Windows 7
Rispondi