Dépôt officiel du code source de l'ERP OpenConcerto
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/OLAPPanel.java |
---|
20,6 → 20,8 |
import org.openconcerto.utils.FileUtils; |
public class OLAPPanel extends JPanel { |
private String loadInfo = ""; |
public OLAPPanel() { |
this.setOpaque(false); |
this.setLayout(new GridLayout(1, 1)); |
38,10 → 40,12 |
if (f.exists()) { |
System.out.println("OLAP: using catalog " + f.getAbsolutePath()); |
catalog = FileUtils.read(f, "UTF8"); |
loadInfo = f.getAbsolutePath() + " ok"; |
} else { |
System.out.println("OLAP: using embedded catalog (" + f.getAbsolutePath() + " missing)"); |
final InputStream in = this.getClass().getResourceAsStream("openconcerto_catalog.xml"); |
catalog = FileUtils.readUTF8(in); |
loadInfo = f.getAbsolutePath() + " missing"; |
} |
final String url = getOlapURL(ComptaPropsConfiguration.getInstanceCompta(), catalog); |
final Connection rConnection = DriverManager.getConnection(url); |
90,4 → 94,8 |
} |
return url; |
} |
public String getLoadInfo() { |
return this.loadInfo; |
} |
} |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/OLAPMainPanel.java |
---|
1,6 → 1,8 |
package org.openconcerto.modules.reports.olap; |
import java.awt.BorderLayout; |
import java.awt.Dimension; |
import java.awt.FlowLayout; |
import java.awt.GridBagConstraints; |
import java.awt.GridBagLayout; |
import java.awt.Insets; |
8,7 → 10,12 |
import java.awt.event.ActionListener; |
import java.awt.event.MouseAdapter; |
import java.awt.event.MouseEvent; |
import java.io.File; |
import java.io.FileWriter; |
import java.io.IOException; |
import javax.swing.JButton; |
import javax.swing.JFileChooser; |
import javax.swing.JLabel; |
import javax.swing.JMenuItem; |
import javax.swing.JPanel; |
17,9 → 24,13 |
import javax.swing.JSplitPane; |
import javax.swing.JTabbedPane; |
import org.jopendocument.panel.Messages; |
import org.olap4j.OlapConnection; |
import org.olap4j.metadata.Schema; |
import org.openconcerto.modules.reports.olap.renderer.Matrix; |
import org.openconcerto.ui.JLabelBold; |
import org.openconcerto.utils.ExceptionHandler; |
import org.openconcerto.utils.text.CSVWriter; |
public class OLAPMainPanel extends JPanel { |
OLAPMainPanel(OlapConnection oConnection, Schema schema, final OLAPPanel olapPanel) { |
32,6 → 43,7 |
c.gridy = 0; |
c.fill = GridBagConstraints.HORIZONTAL; |
final JLabelBold title = new JLabelBold("Analyse multidimensionnelle des données"); |
title.setToolTipText(olapPanel.getLoadInfo()); |
this.addMouseListener(new MouseAdapter() { |
@Override |
public void mouseReleased(MouseEvent e) { |
64,8 → 76,10 |
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); |
split.setBorder(null); |
final OLAPParametersPanel parameters = new OLAPParametersPanel(schema); |
parameters.setMinimumSize(new Dimension(200, 200)); |
parameters.setOpaque(false); |
split.setLeftComponent(parameters); |
split.setDividerLocation(200); |
split.setOpaque(true); |
JPanel rightPanel = new JPanel(); |
75,16 → 89,65 |
final OLAPRenderer renderer = new OLAPRenderer(); |
final OLAPMDXPanel mdxPanel = new OLAPMDXPanel(parameters, oConnection, renderer); |
final OLAPSQLPanel sqlPanel = new OLAPSQLPanel(renderer); |
final OLAPConfigurationPanel confPanel = new OLAPConfigurationPanel(parameters, oConnection, renderer, mdxPanel); |
parameters.setConfigurationPanel(confPanel); |
JTabbedPane t = new JTabbedPane(); |
t.add("Mode simplifié", confPanel); |
t.add("Requête MDX", mdxPanel); |
t.add("Requête SQL", sqlPanel); |
renderer.setOpaque(false); |
t.setOpaque(false); |
// Bottom panel |
JPanel p = new JPanel(); |
p.setLayout(new FlowLayout(FlowLayout.LEFT)); |
JButton bExport = new JButton("Exporter"); |
bExport.addActionListener(new ActionListener() { |
@Override |
public void actionPerformed(ActionEvent e) { |
Matrix m = renderer.getMatrix(); |
if (m == null) { |
return; |
} |
JFileChooser fileChooser = new JFileChooser(); |
fileChooser.setSelectedFile(new File("export_olap.csv")); |
fileChooser.setDialogTitle(Messages.getString("ODSViewerPanel.saveAs")); |
int userSelection = fileChooser.showSaveDialog(OLAPMainPanel.this); |
if (userSelection == JFileChooser.APPROVE_OPTION) { |
File file = fileChooser.getSelectedFile(); |
try { |
int witdth = m.getWidth(); |
final FileWriter writer = new FileWriter(file); |
CSVWriter w = new CSVWriter(writer); |
for (int y = 0; y < m.getHeight(); y++) { |
String[] a = new String[witdth]; |
for (int x = 0; x < witdth; x++) { |
a[x] = m.get(x, y).getValue(); |
} |
w.writeNext(a); |
w.flush(); |
} |
w.close(); |
writer.close(); |
} catch (IOException e1) { |
ExceptionHandler.handle("Erreur lors de l'export", e1); |
} |
} |
} |
}); |
p.add(bExport); |
// |
rightPanel.add(t, BorderLayout.NORTH); |
rightPanel.add(renderer, BorderLayout.CENTER); |
rightPanel.add(p, BorderLayout.SOUTH); |
split.setRightComponent(rightPanel); |
c.weightx = 1; |
c.weighty = 1; |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/OLAPRenderer.java |
---|
1,4 → 1,5 |
package org.openconcerto.modules.reports.olap; |
import java.awt.Color; |
import java.awt.Dimension; |
import java.awt.GridBagConstraints; |
10,10 → 11,10 |
import org.olap4j.CellSet; |
import org.openconcerto.modules.reports.olap.renderer.CellSetRenderer; |
import org.openconcerto.modules.reports.olap.renderer.Matrix; |
import org.openconcerto.ui.DefaultGridBagConstraints; |
import org.openconcerto.ui.ReloadPanel; |
public class OLAPRenderer extends JPanel { |
final CellSetRenderer cellSetRenderer; |
final ReloadPanel reload; |
53,4 → 54,13 |
} |
} |
public Matrix getMatrix() { |
return this.cellSetRenderer.getMatrix(); |
} |
public void setMatrix(Matrix matrix) { |
setWaitState(false); |
cellSetRenderer.setMatrix(matrix); |
} |
} |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/Module.java |
---|
78,21 → 78,4 |
protected void stop() { |
} |
public static void main(String[] args) throws IOException { |
System.setProperty(ConnexionPanel.QUICK_LOGIN, "true"); |
final File propsFile = new File("module.properties"); |
final File distDir = new File("dist"); |
FileUtils.mkdir_p(distDir); |
final ModulePackager modulePackager = new ModulePackager(propsFile, new File("bin/")); |
modulePackager.setSkipDuplicateFiles(true); |
modulePackager.addJarsFromDir(new File("lib")); |
modulePackager.writeToDir(distDir); |
modulePackager.writeToDir(new File("../OpenConcerto/Modules")); |
SQLRequestLog.setEnabled(true); |
SQLRequestLog.showFrame(); |
ModuleManager.getInstance().addFactories(new File("../OpenConcerto/Modules")); |
Gestion.main(args); |
} |
} |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/renderer/Matrix.java |
---|
26,7 → 26,7 |
* @param y Y coordinate |
* @param value Value |
*/ |
void set(int x, int y, String value) { |
public void set(int x, int y, String value) { |
set(x, y, value, false, false); |
} |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/renderer/MatrixCell.java |
---|
18,4 → 18,8 |
this.right = right; |
this.sameAsPrev = sameAsPrev; |
} |
public String getValue() { |
return value; |
} |
} |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/renderer/CellSetRenderer.java |
---|
22,7 → 22,6 |
import org.olap4j.Position; |
import org.olap4j.impl.CoordinateIterator; |
import org.olap4j.impl.Olap4jUtil; |
import org.olap4j.metadata.Member; |
public class CellSetRenderer extends JComponent implements Scrollable { |
34,11 → 33,16 |
private AxisInfo rowsAxisInfo; |
private int w; |
private int h; |
private Matrix matrix; |
public CellSetRenderer() { |
} |
public Matrix getMatrix() { |
return matrix; |
} |
public CellSetRenderer(CellSet set) { |
this.cellSet = set; |
computeCells(); |
45,7 → 49,7 |
} |
public void setCellSet(CellSet set) { |
this.matrix = null; |
this.cellSet = set; |
computeCells(); |
repaint(); |
52,6 → 56,17 |
this.setSize(new Dimension(w, h)); |
} |
public void setMatrix(Matrix matrix2) { |
this.matrix = matrix2; |
this.cellSet = null; |
this.rowsAxis = null; |
this.rowsAxisInfo = null; |
this.columnsAxis = null; |
this.columnsAxisInfo = null; |
repaint(); |
this.setSize(new Dimension(w, h)); |
} |
private void computeCells() { |
if (cellSet == null) { |
return; |
80,10 → 95,16 |
} |
boolean isOuside(int x, int y) { |
if (rowsAxisInfo == null) { |
return false; |
} |
return x < rowsAxisInfo.getWidth() && y < columnsAxisInfo.getWidth(); |
} |
boolean isValue(int x, int y) { |
if (rowsAxisInfo == null) { |
return true; |
} |
return x >= rowsAxisInfo.getWidth() && y >= columnsAxisInfo.getWidth(); |
} |
98,11 → 119,12 |
g.setColor(Color.WHITE); |
g.fillRect(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height); |
if (cellSet == null) { |
if (cellSet == null && matrix == null) { |
return; |
} |
if (cellSet.getAxes().size() > 2) { |
if (cellSet != null && cellSet.getAxes().size() > 2) { |
int[] dimensions = new int[cellSet.getAxes().size() - 2]; |
for (int i = 2; i < cellSet.getAxes().size(); i++) { |
CellSetAxis cellSetAxis = cellSet.getAxes().get(i); |
136,38 → 158,41 |
} |
// Figure out the dimensions of the blank rectangle in the top left |
// corner. |
final int yOffset = columnsAxisInfo.getWidth(); |
final int xOffsset = rowsAxisInfo.getWidth(); |
int yOffset = 0; |
int xOffsset = 0; |
// Populate a string matrix |
Matrix matrix = new Matrix(xOffsset + (columnsAxis == null ? 1 : columnsAxis.getPositions().size()), yOffset + (rowsAxis == null ? 1 : rowsAxis.getPositions().size())); |
if (matrix == null) { |
yOffset = columnsAxisInfo.getWidth(); |
xOffsset = rowsAxisInfo.getWidth(); |
this.matrix = new Matrix(xOffsset + (columnsAxis == null ? 1 : columnsAxis.getPositions().size()), yOffset + (rowsAxis == null ? 1 : rowsAxis.getPositions().size())); |
// Populate corner |
for (int x = 0; x < xOffsset; x++) { |
for (int y = 0; y < yOffset; y++) { |
matrix.set(x, y, "", false, x > 0); |
// Populate corner |
for (int x = 0; x < xOffsset; x++) { |
for (int y = 0; y < yOffset; y++) { |
matrix.set(x, y, "", false, x > 0); |
} |
} |
} |
// Populate matrix with cells representing axes |
// noinspection SuspiciousNameCombination |
populateAxis(matrix, columnsAxis, columnsAxisInfo, true, xOffsset); |
populateAxis(matrix, rowsAxis, rowsAxisInfo, false, yOffset); |
// Populate matrix with cells representing axes |
// noinspection SuspiciousNameCombination |
populateAxis(matrix, columnsAxis, columnsAxisInfo, true, xOffsset); |
populateAxis(matrix, rowsAxis, rowsAxisInfo, false, yOffset); |
// Populate cell values |
for (Cell cell : cellIter(pageCoords, cellSet)) { |
final List<Integer> coordList = cell.getCoordinateList(); |
int x = xOffsset; |
if (coordList.size() > 0) { |
x += coordList.get(0); |
// Populate cell values |
for (Cell cell : cellIter(pageCoords, cellSet)) { |
final List<Integer> coordList = cell.getCoordinateList(); |
int x = xOffsset; |
if (coordList.size() > 0) { |
x += coordList.get(0); |
} |
int y = yOffset; |
if (coordList.size() > 1) { |
y += coordList.get(1); |
} |
matrix.set(x, y, cell.getFormattedValue(), true, false); |
} |
int y = yOffset; |
if (coordList.size() > 1) { |
y += coordList.get(1); |
} |
matrix.set(x, y, cell.getFormattedValue(), true, false); |
} |
final int matrixWidth = matrix.getWidth(); |
final int matrixHeight = matrix.getHeight(); |
int[] columnWidths = new int[matrixWidth]; |
237,21 → 262,30 |
g.drawString(value, xString, y * lineHeight + (int) (spaceH * 1.4f)); |
} |
if (columnsAxisInfo != null) { |
// Top |
if (!isOuside(x, y) |
&& (value.length() > 0 || y == columnsAxisInfo.getWidth() || isValue(x, y) || (!isValue(x, y) && (leftNotEmpty(matrix, x, y - 1)) || leftNotEmpty(matrix, x, y)))) { |
g.setColor(BORDER_COLOR); |
g.drawLine(offsetX, y * lineHeight, offsetX + columnWidth, y * lineHeight); |
// Top |
if (!isOuside(x, y) |
&& (value.length() > 0 || y == columnsAxisInfo.getWidth() || isValue(x, y) || (!isValue(x, y) && (leftNotEmpty(matrix, x, y - 1)) || leftNotEmpty(matrix, x, y)))) { |
} |
if (rowsAxisInfo != null) { |
if ((y < columnsAxisInfo.getWidth() && x >= rowsAxisInfo.getWidth()) || isValue(x, y) || (!isOuside(x, y) && (!leftNotEmpty(matrix, x, y) || !isValue(x, y)))) { |
g.setColor(BORDER_COLOR); |
// Left |
g.drawLine(offsetX, y * lineHeight, offsetX, (y + 1) * lineHeight); |
} |
} |
} else { |
g.setColor(BORDER_COLOR); |
g.drawLine(offsetX, y * lineHeight, offsetX + columnWidth, y * lineHeight); |
} |
if ((y < columnsAxisInfo.getWidth() && x >= rowsAxisInfo.getWidth()) || isValue(x, y) || (!isOuside(x, y) && (!leftNotEmpty(matrix, x, y) || !isValue(x, y)))) { |
g.setColor(BORDER_COLOR); |
// Left |
g.drawLine(offsetX, y * lineHeight, offsetX, (y + 1) * lineHeight); |
} |
} |
} |
} |
offsetX += columnWidth; |
widestWidth = Math.max(columnWidth, widestWidth); |
258,6 → 292,7 |
} |
// Right |
g.setColor(BORDER_COLOR); |
final int bottomRightX = offsetX; |
final int bottomRightY = matrixHeight * lineHeight; |
g.drawLine(offsetX, 0, offsetX, bottomRightY); |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/OLAPSQLPanel.java |
---|
New file |
0,0 → 1,180 |
package org.openconcerto.modules.reports.olap; |
import java.awt.GridBagConstraints; |
import java.awt.GridBagLayout; |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import java.math.BigDecimal; |
import java.text.SimpleDateFormat; |
import java.util.Date; |
import java.util.List; |
import javax.swing.JButton; |
import javax.swing.JLabel; |
import javax.swing.JPanel; |
import javax.swing.JScrollPane; |
import javax.swing.JTextArea; |
import javax.swing.SwingConstants; |
import javax.swing.SwingWorker; |
import javax.swing.event.DocumentEvent; |
import javax.swing.event.DocumentListener; |
import org.apache.commons.dbutils.handlers.ArrayListHandler; |
import org.openconcerto.erp.config.ComptaPropsConfiguration; |
import org.openconcerto.modules.reports.olap.renderer.Matrix; |
import org.openconcerto.sql.model.SQLDataSource; |
import org.openconcerto.ui.DefaultGridBagConstraints; |
import org.openconcerto.ui.warning.JLabelWarning; |
public class OLAPSQLPanel extends JPanel { |
private OLAPRenderer renderer; |
final JLabelWarning w = new JLabelWarning(); |
private JButton bExecute; |
final JTextArea textMDX; |
OLAPSQLPanel(OLAPRenderer renderer) { |
this.setOpaque(false); |
this.renderer = renderer; |
this.setLayout(new GridBagLayout()); |
GridBagConstraints c = new DefaultGridBagConstraints(); |
c.fill = GridBagConstraints.BOTH; |
// Colonnes |
c.gridx = 0; |
c.gridy = 0; |
c.weightx = 1; |
c.weighty = 0; |
JLabel columnsLabel = new JLabel("Requête SQL (select uniquement)", SwingConstants.LEFT); |
this.add(columnsLabel, c); |
c.weighty = 1; |
c.gridy++; |
c.weightx = 1; |
textMDX = new JTextArea(); |
textMDX.setText("select \"NOM\",\"PV_HT\" from \"ARTICLE\" where \"PV_HT\" <300 AND \"ID\">1"); |
textMDX.setLineWrap(true); |
JScrollPane scroll = new JScrollPane(textMDX); |
scroll.setOpaque(false); |
this.add(scroll, c); |
// Lignes |
c.gridx = 0; |
c.gridy++; |
c.weightx = 0; |
c.weighty = 0; |
bExecute = new JButton("Executer"); |
bExecute.setOpaque(false); |
c.fill = GridBagConstraints.NONE; |
c.anchor = GridBagConstraints.WEST; |
this.add(bExecute, c); |
bExecute.addActionListener(new ActionListener() { |
@Override |
public void actionPerformed(ActionEvent e) { |
executeQuery(textMDX.getText()); |
} |
}); |
c.gridy++; |
w.setOpaque(false); |
w.setVisible(false); |
this.add(w, c); |
textMDX.getDocument().addDocumentListener(new DocumentListener() { |
@Override |
public void removeUpdate(DocumentEvent e) { |
w.setVisible(false); |
} |
@Override |
public void insertUpdate(DocumentEvent e) { |
w.setVisible(false); |
} |
@Override |
public void changedUpdate(DocumentEvent e) { |
w.setVisible(false); |
} |
}); |
} |
protected void executeQuery(final String req) { |
String lower = req.toLowerCase(); |
if (lower.contains("update") || lower.contains("delete") || lower.contains("insert") || lower.contains("add") || lower.contains("alter") || lower.contains("drop") || lower.contains("exec")) { |
return; |
} |
this.textMDX.setEditable(false); |
this.bExecute.setEnabled(false); |
SwingWorker<Matrix, Object> worker = new SwingWorker<Matrix, Object>() { |
@Override |
protected Matrix doInBackground() throws Exception { |
try { |
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); |
// voir pour utiliser createDataSource avec un user spécifique en lecture seule |
SQLDataSource src = ComptaPropsConfiguration.getInstanceCompta().getRootSociete().getDBSystemRoot().getDataSource(); |
List result = (List) src.execute(req, new ArrayListHandler()); |
int height = result.size(); |
int width = 0; |
if (height > 0) { |
width = ((Object[]) result.get(0)).length; |
} |
final Matrix matrix = new Matrix(width, height); |
System.err.println("OLAPSQLPanel.executeQuery() MATRIX :" + matrix.getWidth() + " x " + matrix.getHeight()); |
for (int y = 0; y < height; y++) { |
Object o = result.get(y); |
Object[] l = (Object[]) o; |
for (int x = 0; x < width; x++) { |
Object obj = l[x]; |
if (obj == null) { |
obj = ""; |
} |
if (obj instanceof BigDecimal) { |
obj = ((BigDecimal) obj).toPlainString(); |
} |
if (obj instanceof Date) { |
obj = df.format((Date) obj); |
} |
matrix.set(x, y, obj.toString()); |
} |
} |
return matrix; |
} catch (Exception e) { |
e.printStackTrace(); |
w.setVisible(true); |
w.setText(e.getCause().getMessage()); |
return null; |
} |
} |
protected void done() { |
Matrix matrix; |
try { |
matrix = get(); |
renderer.setMatrix(matrix); |
} catch (Exception e) { |
e.printStackTrace(); |
} |
textMDX.setEditable(true); |
bExecute.setEnabled(true); |
} |
}; |
renderer.setWaitState(true); |
worker.execute(); |
} |
} |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/OLAPConfigurationPanel.java |
---|
64,7 → 64,7 |
c.gridy++; |
c.weightx = 0; |
c.gridwidth = 1; |
JLabel filtersLabel = new JLabel("Filtre", SwingConstants.RIGHT); |
JLabel filtersLabel = new JLabel("Mesure", SwingConstants.RIGHT); |
this.add(filtersLabel, c); |
filters = new ParameterHolder(false); |
/trunk/Modules/Module OLAP/src/org/openconcerto/modules/reports/olap/openconcerto_catalog.xml |
---|
2,10 → 2,52 |
<Schema name="OpenConcerto"> |
<Cube name="Ventes"> |
<Table name="SAISIE_VENTE_FACTURE_ELEMENT" schema="_SCHEMA_"/> |
<Table name="SAISIE_VENTE_FACTURE_ELEMENT" schema="_SCHEMA_" /> |
<Dimension name="Commercial" foreignKey="ID_SAISIE_VENTE_FACTURE"> |
<Hierarchy hasAll="true" allMemberName="Tous" primaryKey="ID" primaryKeyTable="SAISIE_VENTE_FACTURE"> |
<Join leftKey="ID_COMMERCIAL" rightKey="ID_COMMERCIAL"> |
<Table name="SAISIE_VENTE_FACTURE" schema="_SCHEMA_" /> |
<Table name="COMMERCIAL" schema="_SCHEMA_" /> |
</Join> |
<Level name="Nom du commercial" table="COMMERCIAL" column="NOM" schema="_SCHEMA_"> |
</Level> |
</Hierarchy> |
</Dimension> |
<Dimension name="Localisation du client" foreignKey="ID_SAISIE_VENTE_FACTURE"> |
<Hierarchy hasAll="true" allMemberName="Tous" primaryKey="ID" primaryKeyTable="SAISIE_VENTE_FACTURE"> |
<Join leftKey="ID_CLIENT" rightKey="ID"> |
<Table name="SAISIE_VENTE_FACTURE" schema="_SCHEMA_" /> |
<Join leftKey="ID_PAYS" rightKey="ID"> |
<Table name="CLIENT" schema="_SCHEMA_" /> |
<Table name="PAYS" schema="_SCHEMA_" /> |
</Join> |
</Join> |
<Level name="Pays" table="PAYS" column="NOM" schema="_SCHEMA_" uniqueMembers="true"> |
</Level> |
<Level name="Nom du client" table="CLIENT" column="NOM" schema="_SCHEMA_"> |
</Level> |
</Hierarchy> |
</Dimension> |
<Dimension name="Client" foreignKey="ID_SAISIE_VENTE_FACTURE"> |
<Hierarchy hasAll="true" allMemberName="Tous" primaryKey="ID" primaryKeyTable="SAISIE_VENTE_FACTURE"> |
<Join leftKey="ID_CLIENT" rightKey="ID"> |
<Table name="SAISIE_VENTE_FACTURE" schema="_SCHEMA_" /> |
<Table name="CLIENT" schema="_SCHEMA_" /> |
</Join> |
<Level name="Nom du client" table="CLIENT" column="NOM" schema="_SCHEMA_"> |
</Level> |
</Hierarchy> |
</Dimension> |
<Dimension name="Articles" foreignKey="ID_ARTICLE"> |
<Hierarchy hasAll="true" allMemberName="Tous les articles" primaryKey="ID"> |
<View alias="ARTICLE"> |
<View alias="articles"> |
<SQL dialect="generic"> <![CDATA[select * from "_SCHEMA_"."ARTICLE" where "ARCHIVE" = '0']]> |
</SQL> |
</View> |
15,7 → 57,7 |
</Dimension> |
<Dimension name="Mode de vente" foreignKey="ID_MODE_VENTE_ARTICLE"> |
<Hierarchy hasAll="true" allMemberName="Tous les modes de vente" primaryKey="ID"> |
<View alias="MODE_VENTE_ARTICLE"> |
<View alias="mode"> |
<SQL dialect="generic"> <![CDATA[select * from "_SCHEMA_"."MODE_VENTE_ARTICLE" where "ARCHIVE" = '0']]> |
</SQL> |
</View> |
26,7 → 68,7 |
<Dimension name="Date de facturation" foreignKey="ID_SAISIE_VENTE_FACTURE" type="TimeDimension"> |
<Hierarchy hasAll="true" allMemberName="Toutes les dates" primaryKey="ID"> |
<View alias="SAISIE_VENTE_FACTURE"> |
<View alias="factures"> |
<SQL dialect="generic"> <![CDATA[select * from "_SCHEMA_"."SAISIE_VENTE_FACTURE" where "ARCHIVE" = '0']]> |
</SQL> |
</View> |
33,7 → 75,7 |
<Level name="Annee" column="DATE" uniqueMembers="true" levelType="TimeYears" type="Numeric"> |
<KeyExpression> |
<SQL dialect="generic"> |
<![CDATA[EXTRACT(YEAR FROM "SAISIE_VENTE_FACTURE"."DATE")]]> |
<![CDATA[EXTRACT(YEAR FROM "factures"."DATE")]]> |
</SQL> |
</KeyExpression> |
</Level> |
42,7 → 84,7 |
formatter="org.openconcerto.modules.reports.olap.formatter.MonthMemberFormatter"> |
<KeyExpression> |
<SQL dialect="generic"> |
<![CDATA[EXTRACT(MONTH FROM "SAISIE_VENTE_FACTURE"."DATE")]]> |
<![CDATA[EXTRACT(MONTH FROM "factures"."DATE")]]> |
</SQL> |
</KeyExpression> |
</Level> |
49,21 → 91,22 |
</Hierarchy> |
</Dimension> |
<Dimension name="Ligne facturees"> |
<Hierarchy hasAll="true" primaryKey="ID"> |
<Table name="SAISIE_VENTE_FACTURE_ELEMENT" schema="_SCHEMA_"/> |
<Level name="Quantite" column="QTE" type="Numeric" uniqueMembers="false"/> |
<Level name="Code article" column="CODE" type="String" uniqueMembers="false"/> |
<Level name="Poids" column="POIDS" type="Numeric" uniqueMembers="false"/> |
<Level name="Designation" column="NOM" type="String" uniqueMembers="false"/> |
</Hierarchy> |
</Dimension> |
<Measure name="Nombre vendu" column="ID_ARTICLE" aggregator="count" formatString="Standard" /> |
<Measure name="Quantite" column="QTE" aggregator="count" formatString="Standard" /> |
<Hierarchy hasAll="true" primaryKey="ID"> |
<Table name="SAISIE_VENTE_FACTURE_ELEMENT" schema="_SCHEMA_" /> |
<Level name="Quantite" column="QTE" type="Numeric" uniqueMembers="false" /> |
<Level name="Code article" column="CODE" type="String" uniqueMembers="false" /> |
<Level name="Poids" column="POIDS" type="Numeric" uniqueMembers="false" /> |
<Level name="Designation" column="NOM" type="String" uniqueMembers="false" /> |
</Hierarchy> |
</Dimension> |
<Measure name="Quantite" column="QTE" aggregator="sum" formatString="Standard" /> |
<Measure name="Prix de vente HT" column="T_PV_HT" aggregator="sum" |
formatter="org.openconcerto.modules.reports.olap.formatter.CentsCellFormatter" /> |
<Measure name="Prix d'achat HT" column="T_PA_HT" aggregator="sum" |
formatter="org.openconcerto.modules.reports.olap.formatter.CentsCellFormatter" /> |
<Measure name="Nombre de lignes" column="ID_ARTICLE" aggregator="count" formatString="Standard" /> |
<CalculatedMember name="Marge" dimension="Measures"> |
<Formula>[Measures].[Prix de vente HT] - [Measures].[Prix d'achat HT] |
</Formula> |
73,31 → 116,31 |
</Cube> |
<Cube name="Clients"> |
<Table name="CLIENT" schema="_SCHEMA_"/> |
<Dimension name="Type de client"> |
<Hierarchy hasAll="true" allMemberName="Toutes formes juridiques" > |
<Level name="Forme juridique" column="FORME_JURIDIQUE" uniqueMembers="true"/> |
</Hierarchy> |
</Dimension> |
<Cube name="Clients"> |
<Table name="CLIENT" schema="_SCHEMA_" /> |
<Dimension name="Type de client"> |
<Hierarchy hasAll="true" allMemberName="Toutes formes juridiques"> |
<Level name="Forme juridique" column="FORME_JURIDIQUE" uniqueMembers="true" /> |
</Hierarchy> |
</Dimension> |
<Dimension name="Langue" foreignKey="ID_LANGUE"> |
<Hierarchy hasAll="true" allMemberName="Toutes les langues" primaryKey="ID" > |
<Table name="LANGUE" schema="_SCHEMA_"/> |
<Hierarchy hasAll="true" allMemberName="Toutes les langues" primaryKey="ID"> |
<Table name="LANGUE" schema="_SCHEMA_" /> |
<Level name="Langue" column="NOM" uniqueMembers="true" /> |
</Hierarchy> |
</Dimension> |
<Dimension name="Pays" foreignKey="ID_PAYS"> |
<Hierarchy hasAll="true" allMemberName="Tous les pays" primaryKey="ID" > |
<Table name="PAYS" schema="_SCHEMA_"/> |
<Hierarchy hasAll="true" allMemberName="Tous les pays" primaryKey="ID"> |
<Table name="PAYS" schema="_SCHEMA_" /> |
<Level name="Pays" column="NOM" uniqueMembers="true" /> |
</Hierarchy> |
</Dimension> |
<Measure name="Nombre" column="ID" aggregator="count" formatString="Standard" /> |
</Cube> |
</Cube> |
</Schema> |
</Schema> |
/trunk/Modules/Module OLAP/module.properties |
---|
1,5 → 1,5 |
# [\p{Alnum}_.]{3,} |
id=org.openconcerto.modules.reports.olap |
# \p{Digit}(\.\p{Digit}+)? |
version=1.0 |
version=1.2 |
contact=ILM Informatique |