Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision d58c5bcc

Von Kivitendo Admin vor mehr als 2 Jahren hinzugefügt

  • ID d58c5bcc7bfda74cc5be260aaefa6a2a19570753
  • Vorgänger ae9aefac
  • Nachfolger 1b3afb17

Artikelbericht - Lieferant korrekt anzeigen

Bisher wurde im Bericht nur die Lieferanten-ID angezeigt, und für jeden
Lieferantenartikel gab es eine eigene Artikel-Zeile, wodurch auch die
Gesamtsummen verfälscht wurden.

Per lateral join und string_agg werden jetzt mehrere Lieferantenartikel
in jeweils eine Textzeile für Lieferant und Lieferantenartikelnummer
umgewandelt.

In Bericht aufnehmen: funktioniert nun auch mit mehreren
Lieferantenartikeln, vorher wurden für jeden Lieferantenartikel mehrere
Artikelzeilen angezeigt, jetzt werden diese per Komma getrennt als Text
angezeigt.

Funktioniert auch für die beiden Filter Lieferant und
Lieferantenartikelnr.

Unterschiede anzeigen:

SL/IC.pm
201 201

  
202 202
  my %joins = (
203 203
    partsgroup => 'LEFT JOIN partsgroup pg      ON (pg.id       = p.partsgroup_id)',
204
    makemodel  => 'LEFT JOIN makemodel mm       ON (mm.parts_id = p.id)',
204
    makemodel  => "LEFT JOIN LATERAL (
205
                      SELECT string_agg(mv.vendornumber || ' ' || mv.name, ', ') AS make,
206
                             string_agg(mm.model, ', ')                          AS model
207
                        FROM makemodel mm
208
                             LEFT JOIN vendor mv ON (mv.id = mm.make)
209
                      WHERE  mm.parts_id = p.id
210
                   ) mm ON TRUE",
205 211
    pfac       => 'LEFT JOIN price_factors pfac ON (pfac.id     = p.price_factor_id)',
206 212
    invoice_oi =>
207 213
      q|LEFT JOIN (
......
219 225
           SELECT id, name, 'customer' AS cv FROM customer UNION
220 226
           SELECT id, name, 'vendor'   AS cv FROM vendor
221 227
         ) AS cv ON cv.id = apoe.customer_id OR cv.id = apoe.vendor_id|,
222
    mv         => 'LEFT JOIN vendor AS mv ON mv.id = mm.make',
223 228
    project    => 'LEFT JOIN project AS pj ON pj.id = COALESCE(ioi.project_id, apoe.globalproject_id)',
224 229
    warehouse  => 'LEFT JOIN warehouse AS wh ON wh.id = p.warehouse_id',
225 230
    bin        => 'LEFT JOIN bin ON bin.id = p.bin_id',
226 231
  );
227
  my @join_order = qw(partsgroup makemodel mv invoice_oi apoe cv pfac project warehouse bin);
232
  my @join_order = qw(partsgroup makemodel invoice_oi apoe cv pfac project warehouse bin);
228 233

  
229 234
  my %table_prefix = (
230 235
     deliverydate => 'apoe.', serialnumber => 'ioi.',
......
405 410
  # all_parts is based upon the assumption that every parameter is named like the column it represents
406 411
  # unfortunately make would have to match vendor.name which is already taken for vendor.name in bsooqr mode.
407 412
  # fortunately makemodel doesn't need to be displayed later, so adding a special clause to where_token is sufficient.
413
  # the lateral join mm already creates a string consisting of vendornumbers and vendornames in mm.make
414
  # and the models in mm.make
408 415
  if ($form->{make}) {
409
    push @where_tokens, 'mv.name ILIKE ?';
416
    push @where_tokens, 'mm.make ILIKE ?';
410 417
    push @bind_vars, like($form->{make});
411 418
  }
412 419
  if ($form->{model}) {
......
449 456
  $joins_needed{pfac}        = 1;
450 457
  $joins_needed{project}     = 1 if grep { $form->{$_} || $form->{"l_$_"} } @project_filters;
451 458
  $joins_needed{makemodel}   = 1 if grep { $form->{$_} || $form->{"l_$_"} } @makemodel_filters;
452
  $joins_needed{mv}          = 1 if $joins_needed{makemodel};
453 459
  $joins_needed{cv}          = 1 if $bsooqr;
454 460
  $joins_needed{apoe}        = 1 if $joins_needed{project} || $joins_needed{cv}   || grep { $form->{$_} || $form->{"l_$_"} } @apoe_filters;
455 461
  $joins_needed{invoice_oi}  = 1 if $joins_needed{project} || $joins_needed{apoe} || grep { $form->{$_} || $form->{"l_$_"} } @invoice_oi_filters;

Auch abrufbar als: Unified diff