Gå til innhold

Fra smal til vid liste


Anbefalte innlegg

Bruker Php 5 og SQLServer2005

Har tre tabeller der

1 .inneholder målesett navn ++

2. målesett definisjoner

3. måleresultater.

 

CREATE TABLE [dbo].[ManHoder](

[id] [int] IDENTITY(1,1) NOT NULL,

[navn] [varchar](100) COLLATE Danish_Norwegian_CI_AI NULL,

[produkt] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

[endretAv] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

[endretDato] [datetime] NULL,

[kommentar] [varchar](500) COLLATE Danish_Norwegian_CI_AI NULL,

[Opearsjon] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

CONSTRAINT [PK_ManHoder] PRIMARY KEY CLUSTERED

(

[id] ASC

))

 

CREATE TABLE [dbo].[ManDetaljer](

[id] [int] IDENTITY(1,1) NOT NULL,

[hodeId] [int] NOT NULL,

[maalNavn] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

[feltType] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

[target] [nchar](10) COLLATE Danish_Norwegian_CI_AI NULL,

[avvikOpp] [nchar](10) COLLATE Danish_Norwegian_CI_AI NULL,

[avvikNed] [nchar](10) COLLATE Danish_Norwegian_CI_AI NULL,

[engUnit] [varchar](10) COLLATE Danish_Norwegian_CI_AI NULL,

[trend] [tinyint] NULL,

CONSTRAINT [PK_ManDetaljer] PRIMARY KEY CLUSTERED

( [id] ASC

))

 

CREATE TABLE [dbo].[manMaalinger](

[settId] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

[hodeId] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

[navn] [varchar](50) COLLATE Danish_Norwegian_CI_AI NULL,

[verdi] [varchar](500) COLLATE Danish_Norwegian_CI_AI NULL,

[id] [int] IDENTITY(1,1) NOT NULL,

CONSTRAINT [PK_manMaalinger] PRIMARY KEY CLUSTERED

(

[id] ASC

))

 

HodeId i manDetaljer og manMaalinger referer til id i ManHoder

ManDetaljer innholder et tusentalls rader som utgjør et hundretalls målesett i manHoder. Mange av målesettene hører sammen da dette bare er forskjellige versjoner av samme målesett. De har da samme navn i ManHoder tabellen. ManMaalinger innholder 100-tusenvis av rader fra målinger

 

Dette var iofs mye database men mest som bakgrunn.

Jeg henter dette opp i php og presenter målinger fra et valgt målesett-navn i trend og tabell men da selvsagt i en "bred" tabel der hver settId blir til en rad. Gjør transformering i php i dag. Dette går helt uproblematisk så lenge målesett detaljene ikke har endret seg. Problemet dukker opp ved endringer, mer spesifikt når man legger til nye rader i et målesett. Av hensyn til sporing lagres et nytt sett i manHoder og manDetaljer ved hver endring i definisjonen. For vising velges alltid siste målesett (med rett målesettnavn i manHoder) fra manDetaljer.

 

Er det noen som har et forslag til hvordan jeg kan lage en array som ser omtrent slik ut:

 

SettId Key Verdi

12345 - <vekt> - 12.4

- <høyde> - 123

- <bredde> - null

- <lengde> - null

12346 - <vekt> - 12.4

- <høyde> - null

- <bredde> - 45

- <lengde> - null

12347 - <vekt> - 12.4

- <høyde> - 123

- <bredde> - 45

- <lengde> - 556

Pr. i dag mener jeg at det er den samme arrayen uten elementene med null:

12345 - <vekt> - 12.4

- <høyde> - 123

12346 - <vekt> - 12.4

- <bredde> - 45

12347 - <vekt> - 12.4

- <høyde> - 123

- <bredde> - 45

- <lengde> - 556

Key som skal være med er bestemmt utfra siste versjon og den har jeg tak i.

Jobben blir da å lage en array med hull i.

Noen forslag?

Endret av Babelfisken
Lenke til kommentar
Videoannonse
Annonse
Noen forslag?

Ville valgt å bruke engelske navn på variabler, i alle fall ikke bruke æøå, men uansett: Hvordan er det du henter du arrayen idag? Regner med det er i en while loop? Hva med å bruke:

<?php
while ....
{
$array[$key]['vekt'] = isset($row['myrow']) ? $row['myrow'] : 'null';
$array[$key]['høyde'] = isset($row['myrow']) ? $row['myrow'] : 'null';
$array[$key]['bredde'] = isset($row['myrow']) ? $row['myrow'] : 'null';
$array[$key]['lengde'] = isset($row['myrow']) ? $row['myrow'] : 'null';
}
?>

Dette avhengier veldig av hvordan du henter ut data pr idag. Men endre "høyde" til "hoyde" evt engelske navn, og post hvordan du lager arrayen idag, så skal det nok ikke være så vanskelig å modifisere :)

Lenke til kommentar
Noen forslag?

Ville valgt å bruke engelske navn på variabler, i alle fall ikke bruke æøå, men uansett: Hvordan er det du henter du arrayen idag? Regner med det er i en while loop? Hva med å bruke:

<?php
while ....
{
$array[$key]['vekt'] = isset($row['myrow']) ? $row['myrow'] : 'null';
$array[$key]['høyde'] = isset($row['myrow']) ? $row['myrow'] : 'null';
$array[$key]['bredde'] = isset($row['myrow']) ? $row['myrow'] : 'null';
$array[$key]['lengde'] = isset($row['myrow']) ? $row['myrow'] : 'null';
}
?>

Dette avhengier veldig av hvordan du henter ut data pr idag. Men endre "høyde" til "hoyde" evt engelske navn, og post hvordan du lager arrayen idag, så skal det nok ikke være så vanskelig å modifisere :)

 

Ikke så mye æøå i varaiabelnavnene, bare i data. Merk også at vekt, høyde.. bare var tilfeldig eksempler. manDetlajer innholder hundrevis av templater med tusenvis av navn.

function listMaalinger($maaleHodeNavn){
// Henter de siste XXX måalingene fra valgte målesett
// data ligger lagret en måling pr rad. Funksjonen returner alle verdier pr registrering på en rad.
//Henter først sist registerte målesettdefinisjon. 
$CID1 = DBLogonDf();
$resultat = mssql_query("Select  *
FROM manDetaljer
WHERE hodeId = (select max(id) from manHoder where navn = '".$maaleHodeNavn. "') 
Order by id", $CID1);
while($line = mssql_fetch_assoc($resultat))	{
		$datafelt[] = $line['maalNavn'];
		$template[$line['maalNavn']] = '';
	}
$CID1 = DBLogonDf();
$i = 0;
if (isset($template))	{
  foreach ($template as $key=>$value)	{
	$i++;
	if ($i == 1)
		$kolonner =  "'".$key."'";
	else 
		$kolonner = $kolonner.", '".$key."'";
  }
	   // Standardfelt som alltid er med:
  $kolonner = $kolonner.", 'operator', 'dato', 'kommentar'";

  $selectString = "
  Select top 3000 *
  FROM manMaalinger
 //litt av problemet ligger her. Det kan være mange varianter av templatene og 
//data fra alle skal i størst mulig mulig grad være med

 WHERE hodeId IN (select id from manHoder where navn = '".$maaleHodeNavn. "')
   //Litt tung betingelse her som vi bør ungå
  AND navn IN (".$kolonner.")  
   //sortering på navn er heller ikke ønsket
  Order by Settid desc, navn"; 
  //echo $selectString;
  $resultat = mssql_query($selectString, $CID1);
  $id = 0;
//det er vel antagelig under her jeg ønsker å bruke $kolonner e.l. 
//til hjelp for å bygge opp en array som  
//inneholder   [key] value også der det mangler data.
//For meg er det også en utfordring å finne en rask måte å 
//matche [key] i resultatsett med $line['navn'] innholdet.
  while($line = mssql_fetch_assoc($resultat))	{
		$id = $line['settId'];
		if ($line['verdi'] <> '' and $line['verdi'] <> ' ') 	 {
			$resultatsett[$line['settId']][$line['navn']] = $line['verdi'];
						}
		else $resultatsett[$line['settId']][$line['navn']] = '-';
  }
  IF (mssql_num_rows($resultat) > 0) {
	//viewArray($resultatsett);
	RETURN $resultatsett;

  }
  else RETURN 0;
  }
else RETURN 0;
}

Denne funksjonen etterlater ingen hull der det mangler data. Den viser heller ikke "kolonner" det ikke er data i, feks. en nylig innlagt "kolonne". Med kolonner mener jeg da en record i manDetaljer som tilhører et målesett template/definisjon. Man har tatt et valg der det er den sist definerte tamplaten for et gitt målesett-navn som danner basis for presentasjonen av data. Data lagret med basis i eldre templater som innholder andre navn blir da utelatt.- en akseptabel svakhet.

Endret av Babelfisken
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...