SQL: Inserte flere poster samtidig

No comments

Her er en måte å inserte flere records i samme insert:
 
 
 
INSERT INTO [Database].[dbo].[StatusType]
           ([StatusId]
           ,[HendelseTypeId]
           ,[Status]
           ,[LogtilKode]
           ,[Velgbar]
           ,[XStatus])
SELECT
 15,1,'',1,0,'STARTSAK'
UNION ALL
SELECT
 15,2,'',1,0,'STARTSAK'
union all
SELECT
 15,3,'',1,0,'STARTSAK'
UNION ALL
SELECT
 15,4,'',1,0,'STARTSAK'
UNION ALL
SELECT
 15,5,'',1,0,'STARTSAK'
UNION ALL
SELECT
 15,6,'',1,0,'STARTSAK'
UNION ALL
 
 
 SELECT
  23,1,'Eierskifte',1,0,'EIERSKIFTE'
 UNION ALL
 SELECT
  23,2,'Eierskifte',1,0,'EIERSKIFTE'
 union all
 SELECT
  23,3,'Eierskifte',1,0,'EIERSKIFTE'
 UNION ALL
 SELECT
  23,4,'Eierskifte',1,0,'EIERSKIFTE'
 UNION ALL
 SELECT
  23,5,'Eierskifte',1,0,'EIERSKIFTE'
 UNION ALL
 SELECT
  23,6,'Eierskifte',1,0,'EIERSKIFTE'
 
union all
 
 SELECT
  13,1,'Ok/Lest',1,0,'UNDER_ARBEID'
 UNION ALL
 SELECT
  13,2,'Ok/Lest',1,0,'UNDER_ARBEID'
 union all
 SELECT
  13,3,'Ok/Lest',1,0,'UNDER_ARBEID'
 UNION ALL
 SELECT
  13,4,'Ok/Lest',1,0,'UNDER_ARBEID'
 UNION ALL
 SELECT
  13,5,'Ok/Lest',1,0,'UNDER_ARBEID'
 UNION ALL
 SELECT
  13,6,'Ok/Lest',1,0,'UNDER_ARBEID'
 
GO

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Generell funksjon for å eksportere en gridview til Excel

No comments
Store deler av denne koden er hentet fra denne bloggen: http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html
Eneste improve er at klasser, styles osv blir beholdt + muligheten for å ta med et stylesheet ved exporten.
Og her kommer koden:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/// <summary>
/// Util for å exportere Gridview til Excel
/// </summary>
public class GridViewExportUtil
{
/// <summary>
/// Exporter Gridview til Excel
/// </summary>
/// <param name="fileName"></param>
/// <param name="gv"></param>
public static void Export(string fileName, GridView gv)
{
Export(fileName, gv, "");
}
/// <summary>
/// Exporterer GridView til Excel
/// </summary>
/// <param name="fileName"></param>
/// <param name="gv"></param>
/// <param name="styleSheet"></param>
public static void Export(string fileName, GridView gv, string styleSheet)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader(
"content-disposition", string.Format("attachment; filename={0}", fileName));
HttpContext.Current.Response.ContentType = "application/ms-excel";
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
Table tbl=new Table();
TableRow rad=new TableRow();
tbl.Controls.Add(rad);
TableCell cell=new TableCell();
if (gv.HeaderRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
}

foreach (GridViewRow row in gv.Rows)
{
GridViewExportUtil.PrepareControlForExport(row);
}

if (gv.FooterRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
}
cell.Controls.Add(gv);
rad.Controls.Add(cell);
tbl.Controls.Add(rad);
tbl.RenderControl(htw);
// hvis stylesheet er spesifisert ta det med
if (!String.IsNullOrEmpty(styleSheet))
{
try
{
StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath(styleSheet));
string s = sr.ReadToEnd();
sr.Close();
HttpContext.Current.Response.Write("<HEAD><STYLE>");
HttpContext.Current.Response.Write(s.ToString());
HttpContext.Current.Response.Write("</STYLE></HEAD>");
}
catch { }
}
// skriv htmlwriter til response
HttpContext.Current.Response.Write(sw.ToString());
HttpContext.Current.Response.End();
}
}
}
/// <summary>
/// Erstatt kontroller med text
/// </summary>
/// <param name="control"></param>
private static void PrepareControlForExport(Control control)
{
for (int i = 0; i < control.Controls.Count; i++)
{
Control current = control.Controls[i];
if (current is LinkButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
}
else if (current is ImageButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
}
else if (current is HyperLink)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
}
else if (current is DropDownList)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
}
else if (current is CheckBox)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "Ja" : "Nei"));
}
if (current.HasControls())
{
GridViewExportUtil.PrepareControlForExport(current);
}
}
}
}

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Attributt på Properties for å lagre i Viewstate

No comments
Denne koden definerer en attributt for enkelt å sette en property til å lagres i Viewstate på dene måten:
[LagreIViewState]
public bool VisPager
{
get;set;
}
Denne propertyen vil nå bli lagret og lastet til/fra ViewState.
Hvis du ønsker en defaultverdi kan du også bruke det:
[LagreIViewState(true)]
public bool VisPager
{
get;set;
}
Tilsvarende for en int:
[LagreIViewState(15)]
public int PageSize
{
get; set;
}
og en streng:
[LagreIViewState("Kunde ASC)]
public string Sortering
{
get; set;
}
For å få dette til må vi utvide Page litt:
(Samme kode kan brukes for UserControl hvis du vil overstyre den)

public class PageBase : PageBase
{
/// <summary>
/// Attributt for å kunne lagre propertier i viewstate på denne måten:
/// [LagreIViewState] public type variabelnavn...
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class LagreIViewState : Attribute
{
object _DefaultVerdi = null;
public LagreIViewState(object DefaultVerdi)
{
_DefaultVerdi = DefaultVerdi;
}
public LagreIViewState()
{
}
public object DefaultVerdi
{
get { return _DefaultVerdi; }
}
}
/// <summary>
///
/// </summary>
/// <param name="savedState"></param>
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
PropertyInfo[] properties = GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
object[] attributes = property.GetCustomAttributes(typeof(LagreIViewState), true);
if (attributes.Length > 0)
{
if (ViewState[property.Name] != null)
{
property.SetValue(this, ViewState[property.Name], null);
}

}
}
}
protected override object SaveViewState()
{
PropertyInfo[] properties = GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
object[] attributes = property.GetCustomAttributes(typeof(LagreIViewState), true);
if (attributes.Length > 0)
{
ViewState[property.Name] = property.GetValue(this, null);
}
}
return base.SaveViewState();
}
private void SettDefaultProperties()
{
PropertyInfo[] properties = GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
object[] attributes = property.GetCustomAttributes(typeof(LagreIViewState), true);
if (attributes.Length > 0)
{
LagreIViewState o = (LagreIViewState)attributes[0];
if (o.DefaultVerdi != null)
property.SetValue(this, o.DefaultVerdi, null);

}
}
}
void Page_Init(object sender, System.EventArgs e)
{
if (!Page.IsPostBack) SettDefaultProperties();
}
I sidene du vil benytte dette:
public partial class Hendelseside : PageBase
{
[LagreIViewState(true)]
public bool VisPager
{
get;set;
}

[LagreIViewState(15)]
public int PageSize
{
get;
set;
}

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Vise sortering og hover på Gridview

1 comment

Denne koden gjør følgende:
- Viser rad som er merket/pekeren er over.
- Viser kolonne som er sortert, både heading og celler
- viser sortert kolonne også ved Hover, med egen style for denne
 

 
 
.CSS
 
TR.GridHead A { DISPLAY: block; COLOR: #fff}
TH.SortAsc
{
 PADDING-RIGHT: 18px;
 PADDING-LEFT: 5px;
 BACKGROUND: url(../master/images/sort_asc.gif) #c48356 no-repeat right center
}
TH.SortDesc

 PADDING-RIGHT: 18px;
 PADDING-LEFT: 5px;
 BACKGROUND: url(../master/images/sort_desc.gif) #c48356 no-repeat right center
}
.SortertRad { BACKGROUND-COLOR:#efefef}
.SortertAltRad { BACKGROUND-COLOR:  #e3e3e3}
.SortertRadHover { BACKGROUND-COLOR: #c48356; color: White;}
.SortertAltRadHover { BACKGROUND-COLOR: #c48356; color: White;}
 
tr.oddline, td.oddline {
background-color:#fff;
}
tr.evenline, td.evenline {
background-color:#f2f2f2;
}
tr.evenlineHover
{
 background-color: #f4a376;
}
tr.oddlineHover
{
 background-color: #f4a376;
}
 
 
.ASCX
 
<script language="javascript">
 
    function setHover(tr)
    {
        if(tr.className.indexOf("Hover")>0)          
            tr.className=tr.className.substring(0,tr.className.indexOf('Hover'))
        else if(tr.className.length>0)
            tr.className+="Hover";
        var trs = tr.getElementsByTagName('TD');
        for(var i=0; i<trs.length; i++)
        {
            if(trs[i].className.indexOf("Hover")>0)          
                trs[i].className=trs[i].className.substring(0,trs[i].className.indexOf('Hover'))
        else if(trs[i].className.length>0)
            trs[i].className+="Hover";
           
    }
}
</script>
 
 
 
 
.CS
 
 
HentSortering og Kolonner[] er egne funksjoner/objekter vi har laget.
Man kan i stedet bruke gridview.SortExpression og gridview.SortDirection samt f.eks finne underliggende datafelt og indeks fra dette.
 
  protected void gridview_RowDataBound(object sender, GridViewRowEventArgs e)
    {
 
        string sortfelt; string retning;
        HentSorterering(out sortfelt, out retning);
 

        if (e.Row.RowType == DataControlRowType.Header)
        {
            e.Row.Cells[kolonner[sortfelt].Indeks].CssClass =
                retning == "ASC" ? "SortAsc" : "SortDesc";
        }
        else if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Cells[kolonner[sortfelt].Indeks].CssClass = e.Row.RowIndex % 2 == 0 ? "SortertRad" : "SortertAltRad";
 
            if (VisHoverRad)
            {
                e.Row.Attributes.Add("onmouseover", "this.style.cursor='hand';setHover(this);");
                e.Row.Attributes.Add("onmouseout", "setHover(this);");
            }
 
        }

Posted by email from Henris blogg (posterous)

1 comment :

Post a Comment

Kjøre c# kode når et vindu lukkes

No comments

Ved å bruke Ajax kan man kalle C# kode ved body.unload osv.
 
Koden her sjekker om en verdi er satt som indikerer at record er endret (document.getElementById('" + oppdatert.ClientID + "').value!='')
Hvis den er endret kalles c# metoden OppdaterMeny.
 
 
Sett enablepagemethods til true i scriptmanager:
Aspx-fil
<asp:ScriptManager ID="script1" runat="server" />
 
 
Javascript
 private void JavaScript()
    {
        StringBuilder script = new StringBuilder();
        script.Append("<script language='javascript'>");
        script.Append("function retVerdi(){window.returnValue=document.getElementById('" + oppdatert.ClientID + "').value;}");
        script.Append("function handleClose(){if(document.getElementById('" + oppdatert.ClientID + "').value!='') PageMethods.OppdaterMeny();}");         script.Append("</script>");
 
        Body.Attributes.Add("OnUnload", "handleClose(); retVerdi();");
        Page.ClientScript.RegisterStartupScript(this.GetType(), "retVerdi", script.ToString());
    }
 
 
 
 
C# metode som kalles
[WebMethod]
public static void OppdaterMeny()
    {
     
      if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            CMSUtils cms = new CMSUtils();
            cms.SettCMSMenyFilter();
 
        }
    }
dvs at du trenger en
using System.Web.Services;
på toppen...
 
 
 
 
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Javascript åpne vindu, refreshe parent ved lukking. Også Ajax

No comments


script.Append( "function openModalWindow(side,id, Aktoernummer, HendelsetypeID, Laast, UnikID)\n");
script.Append( "{\n");
script.Append( "var res = window.showModalDialog(side + '?HendelseInformasjonID='+id + '&Aktoernummer=' + Aktoernummer + '&HendelsetypeID=' + HendelsetypeID + '&Laast=' + Laast + '&UnikID=' + UnikID,null,'status:no;dialogWidth:750px;dialogHeight:600px;center:yes;dialogHide:true;help:no;scroll:yes');\n");
script.Append( "if(res!=null)\n");
script.Append("{ __doPostBack('" + update1.ClientID + "', ''); }\n");
script.Append( "}\n");
script.Append( "</script>\n");


Update1 er et Ajax UpdatePanel

For å oppdatere en vanlig side uten Ajax:
script += "{ __doPostBack('__Page', 'MyCustomArgument'); }\n";

 

I siden/vinduet som åpnes:

script.Append("<script language='javascript'>");
script.Append("function retVerdi(verdi){window.returnValue=verdi;}");

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Araxis merge hurtigtaster

No comments

Flytte til neste endring
 
Ctrl - PageDown
 
Forrige endring:
 
Ctrl - PageUp
 
 
 
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Integrere Araxis merge med VS

No comments

For å integrere Araxis merge med Visual Studio:
 
I Visual Studio:
Tools - Options - Source control - Visual Studio Team Foundation Server -
[Configure User Tools ]
 
Add:
 
Compare:
/wait /2 /title1:%6 /title2:%7 %1 %2

 
 
Merge:
 /wait /swap /a3 /3 /title1:%6 /title2:%7 /title3:%8 %1 %2 %3 %4

 
 
Les evt. mer her:
og her:
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Delegate event

No comments
Gridview usercontrol som delegerer RowDataBound

i Usercontrol

public partial class UserControls_Felles_Grid : SatsUserControlBase
{
public delegate void RowDataBound(object sender, GridViewRowEventArgs e);
public event RowDataBound GridRowDataBound;

protected void gridview_RowDataBound(object sender, GridViewRowEventArgs e)
{
OnRowDataBound(e);
}


protected void OnRowDataBound(GridViewRowEventArgs e)
{
if (GridRowDataBound != null)
GridRowDataBound(this, e);
}

....

}

i side som benytter usercontrol

.aspx

<%@ Page Language="C#" CodeFile="Hendelser.aspx.cs" Inherits="Hendelseside" Title="Hendelser" %>

<%@ Register Src="~/UserControls/Felles/Grid.ascx" TagName="Grid" TagPrefix="uc" %>

<asp:Content ID="MainContent" ContentPlaceHolderID="hovedInnhold" runat="server">
<table>
<tbody>
<tr>
<td>
<uc:Grid ID="gv" runat="server" />
</td>
</tr>
...

</asp:Content />

.cs

protected override void OnInit(EventArgs e)
{

gv.GridRowDataBound += new UserControls_Felles_Grid.RowDataBound(gv_GridRowDataBound);
}


void gv_GridRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView rad = e.Row.DataItem as DataRowView;
// HendelseinformasjonID
TableCell cell = e.Row.Cells[gv.Kolonner["HendelseInformasjonID"].Indeks];
string HendelseID = cell.Text;

cell.ToolTip = rad["Beskrivelse"];
....

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Regulære uttrykk

No comments

Brukt i Visual Studio for å erstatte
 
script += "<her kommer noe/>";
 
til
 
script.Append("<her kommer noe/>");
 
(legg merke til at sluttparantes blir lagt til bakerst samtidig...:
 
Trykk Ctrl - H i VS for Søk og Replace
og velg Use - Regular expressions
 
 
Find what:
    script \+= {.*};
 
 
Replace with:
    script.Append( \1);
 
 
Følgende er spesielt:
 
Søkestreng:
\+= gir  +=  \ brukes som escape character
 
{.*} : {} betyr tag expression (lagre som "variabel")
.* betyr 0 eller flere av en hvilken som helst karakter
 
Erstattstreng:
\1 : Tagged expression 1
 
 
That's it
Mvh
Henri
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Utvide XML-fil med ekstra element

No comments

if (foreningsNummer == "22" && ordningsNummer == "005")
{
 
 XmlDocument data = new XmlDocument();
 data.Load(xmlr);
 XmlNode nodedekning = data.SelectSingleNode("/Dekninger/Dekning");
 XmlElement ytelse = data.CreateElement("Ytelse");
 ytelse.InnerXml = PremieTUK80.ValgtYtelse;
 nodedekning.AppendChild(ytelse);
 prisListe = data.OuterXml;
}

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Keyboard shortcuts Visual Studio/C#

No comments

Keyboard shortcuts

http://www.codeproject.com/KB/tips/VSnetIDETipsAndTricks.aspx

http://www.microsoft.com/downloads/details.aspx?familyid=e5f902a8-5bb5-4cc6-907e-472809749973&displaylang=en

 

 

F2 Refactor - Rename

IntelliSense/Complete word/suggest

Ctrl – space , evt Ctrl – K, Ctrl  - W

 

Parameter tips

Ctrl – Shift - Space

Edit

ParameterInfo

 

Definisjon

F12                 - Gå til definisjon av variable, metode osv

 

 

Generate Method Stub

Ctrl+K, Ctrl+M

Edit

GenerateMethodStub

 

Slå sammen/ Collapse

Ctrl – M, M      Prosedyre åpne/lukke prosedyre

Ctrl – M, O      slå alt sammen til prosedyredefinisjoner

Ctrl – M, L       av/på alt i vindu

 

Topp/bunn prosedyre, region, ””

  • Ctrl – Å                       Hopp til start/slutt av {  } / region / quote
  • Ctrl – Shift – Å            Merk fra topp til slutt

 

Kopiere/paste flere forskjellige steder samtidig

  • Kopiere/paste fra flere kilder/steder.
    Merk det du vil kopiere og Ctrl – C, merk neste sted og Ctrl –C osv.
    Paste ved å trykke Ctrl – Shift – V evt Ctrl – Shift – Ins og gjenta evt til du finner rett paste

Formatere dokument (automatisk)

Ctrl+E, Ctrl+D

Edit

FormatDocument

 

Søk

  • Ctrl – I             inkrementell søk,
  • F3 for neste
  • Ctrl – Shift – I for baklengs

 

Transpose/ bytte plass

Linjer:  Shift – Alt – T  : linjen du står på bytter plass med den under

 

Uppercase/Lowercase

Ctrl+Shift+U

Edit

MakeUppercase

Ctrl+U

Edit

MakeLowercase

 

Åpne Kodevindu etc

 

  • Properties (F4),
  • Solution Explorer (Ctrl+Alt+L),
  • Output Window (Ctrl+Alt+O),
  • Task List (Ctrl+Alt+K)

 

Redigering

Ctrl+Del

Edit

WordDeleteToEnd

Ctrl+Del

Edit

WordDeleteToEnd

Ctrl+K, S

Edit

SurroundWith

 

 

Refactor

Ctrl+R, E

Refactor

EncapsulateField

F2

 

Rename

 

 

 

 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Javascript: Finne elementer med delvis id

No comments

//Gjøre noe med første/eneste som har partid
function GetFirstElmentWithPartialID(partid)
{
   re = new RegExp('.*' + partid + '.*'); 
   for(i = 0; i < document.forms[0].elements.length; i++)
   {
      elm = document.forms[0].elements[i]
      if (re.test(elm.id))
      {
        //do something
        return elm;
        break;
      }
   }
}
 
//Gjøre noe med alle som har partid
function GetAllElmentsWithPartialID(partid)
{
   re = new RegExp('.*' + partid + '.*'); 
   for(i = 0; i < document.forms[0].elements.length; i++)
   {
      elm = document.forms[0].elements[i]
      if (re.test(elm.id))
      {
        //do something       
      }
   }
}

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Sql: Oppdatere Topp 100 poster

No comments

Oppdaterer de 100 første postene med eier=null:
 

UPDATE    TOP (100) Hendelse

SET              Eier = ISNULL(Eier, 12345)

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Sqlserver: Stored procedures: Returner flere verdier fra subquery

No comments

Dette er en utvidelse av en del av forrige post.

Her kjører vi selfjoin på en subquery for å kunne returnere flere verdier fra samme subquery:

CREATE PROCEDURE [dbo].[sp_ProduktlistingNy]

@dato datetime = NULL,

@leverandorid int = NULL

AS

BEGIN

IF @dato IS NULL SET @dato= getdate();

SELECT TOP (100) PERCENT P.ProduktID , P.LeverandorID, P.Navn, P.Betalingsinformasjon,

P.KravOmEpostFaktura, P.KravOmEfaktura, P.KravOmAvtalegiro, P.Landsdekkende,

P.Inaktiv, T.Termin, TYP.ProduktType,

TYP.Kortnavn, PV1.KraftPris, PV1.TidspunktInnmelding

FROM dbo.Produkter P

INNER JOIN

dbo.ProduktTyper TYP ON P.ProduktTypeID = TYP.ProduktTypeID

INNER JOIN

dbo.Terminer T ON P.TerminID = T.TerminID

LEFT OUTER JOIN

dbo.Prisvarsler PV1 ON (select TOP(1) ProduktID from dbo.PrisVarsler PV Where PV.ProduktID=P.ProduktID AND PV.GjelderFraDato<=@dato ORDER BY PV.GjelderFraDato) = PV1.ProduktID

WHERE (P.LeverandorID = @LeverandorId OR @LeverandorID is null)

ORDER BY P.LeverandorID, TYP.Kortnavn

END

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Sqlserver: Stored procedures,valgfrie parametre og subquery i select-setning

No comments
Valgfrie parametre i en Stored procedure:

Her defineres to valgfrie parametre.
De blir valgfrie fordi de har fått satt en defaultverdi - Null i dette tilfellet:

@dato datetime = NULL,
@leverandorid int = NULL

deretter blir @dato satt til dagens dato hvis den er null,
dvs hvis ikke @dato ble sendt inn som parameter (evt ble sendt inn med verdi null):

BEGIN
IF @dato IS NULL SET @dato= getdate();

@LeverandorID kan ikke løses på samme måten. Dersom den er tom dvs null kan vi ikke sette denne til en spesiell verdi for å returnere alle poster.
Å velge WHERE @LeverandorID = null fører IKKE til rett resultat.
I stedet bruker vi en OR setning som vil returnere true hvis @LeverandorID = null, nemlig:

WHERE
(dbo.Produkter.LeverandorID = @LeverandorId OR @LeverandorID is null)


Subquery/Select i select:

I enkelte tilfeller fører ikke en vanlig join av tabeller frem.
Under er et eksempel som kjører en subquery for å finne den nyeste prisen fra en relatert tabell med mange priser.
Husk paranteser rundt subqueryen og gi den et navn vha as:

Select …, dbo.ProduktTyper.Kortnavn, (select TOP(1)KraftPris from dbo.PrisVarsler Where ProduktID=dbo.Produkter.ProduktID AND GjelderFraDato<=@dato ORDER BY GjelderFraDato) as GjeldendePris
FROM dbo.Produkter ….


Dato fra sqlserver til PHP:

Hvordan konvertere en dato fra Sqlserver for bruk i PHP:
CONVERT(varchar, dbo.Produkter.Opprettet, 104) + ' ' + SUBSTRING(CONVERT(varchar, dbo.Produkter.Opprettet, 108), 1, 5) AS Opprettet,



Full listing av Stored procedure:


CREATE PROCEDURE [dbo].[sp_Produktlisting]

@dato datetime = NULL,
@leverandorid int = NULL
AS

BEGIN

IF @dato IS NULL SET @dato= getdate();

SELECT TOP (100) PERCENT dbo.Produkter.ProduktID , dbo.Produkter.LeverandorID, dbo.Produkter.Navn,
dbo.Produkter.Betalingsinformasjon,dbo.Produkter.KravOmEpostFaktura, dbo.Produkter.KravOmEfaktura,
dbo.Produkter.KravOmAvtalegiro, dbo.Produkter.Landsdekkende,

CONVERT(varchar, dbo.Produkter.Opprettet, 104) + ' ' + SUBSTRING(CONVERT(varchar,dbo.Produkter.Opprettet, 108), 1, 5) AS Opprettet,
dbo.Produkter.Inaktiv, CONVERT(varchar, dbo.Produkter.Oppdatert, 104) AS Oppdatert, dbo.Terminer.Termin, dbo.ProduktTyper.ProduktType,dbo.ProduktTyper.Kortnavn,

(select TOP(1)KraftPris from dbo.PrisVarsler Where ProduktID=dbo.Produkter.ProduktID AND GjelderFraDato<=@dato ORDER BY GjelderFraDato) as GjeldendePris

FROM dbo.Produkter INNER JOIN

dbo.ProduktTyper ON dbo.Produkter.ProduktTypeID = dbo.ProduktTyper.ProduktTypeID INNER JOIN
dbo.Terminer ON dbo.Produkter.TerminID = dbo.Terminer.TerminID
WHERE (dbo.Produkter.LeverandorID = @LeverandorId OR @LeverandorID is null)
ORDER BY dbo.Produkter.LeverandorID, dbo.ProduktTyper.Kortnavn



No comments :

Post a Comment

c#: Konvertere fra Array til List

No comments
En webservice som returnerer en List<T> vil på andre siden dukke opp som en array av <T>
Enkleste måten å få den fine listen din tilbake til en List<t>
er metoden .AddRange() på listen din.
string[] arr=ws.GetSomething();
List<string> liste=new List<string>();
liste.AddRange(arr);
Eller bare direkte:
List<string> liste=new List<string>();
liste.AddRange(ws.GetSomething());
hvor ws.Getsomething returnerer en liste (som altså blir en array av string)

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

XSL: Variabler og parametre

No comments

Sette en variabel basert på kriterier:
 
I vanlige programmeringsspråk ser man ofte lignede uttrykk:
 
if(a) b=2; else b=3;
 
I xsl er variabler konstante. (pun intented)
 
Dvs. har du satt en variabel får du ikke sette den på ny.
(dvs. den kan f.eks være inni et template og bli satt til en ny verdi ved hver gjennomkjøring, men da er variabelen "ny" ved hver gjennomkjøring)
 
For å sette en variabel basert på visse kriterier kunne man se for seg noe sånt som dette:
 
 
    <xsl:choose>
      <xsl:when test="$TypeProdukt='Trygghet'">
        <xsl:variable name="linkerspar">1
        </xsl:variable>
      </xsl:when>
      <xsl:when test="$TypeProdukt= 'Forening'">
        <xsl:variable name="linkerspar">2

        </xsl:variable>
      </xsl:when>
    </xsl:choose>
 
men dette vil bare gi to variable som har scope/levetid kun innenfor sin respektive When-setning.
$linkerspar vil ikke finnes når xsl:choose-setningen er ferdig
 
 
XSL-måten å gjøre det på er motsatt:
 
    <xsl:variable name="linkerspar">
     <xsl:choose>
      <xsl:when test="$TypeProdukt='Trygghet'">
1
      </xsl:when>
      <xsl:when test="$TypeProdukt= 'Forening'">2
      </xsl:when>
     </xsl:choose>
    </xsl:variable>
 
 
 
Sjekke verdi av en variabel:
 
over ser du også hvordan du kan sjekke verdien på variabelen:
 
<xsl:when test="$TypeProdukt='Trygghet'">
eller sjekke for null:
 
<xsl:if test="$image = null ">
 
 
Globale variabler/scope:
 
For at en variabel skal være global må den defineres som et barn/child av <xsl:stylesheet>
 
f.eks:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
    <xsl:variable name="TypeKontakt">
      <xsl:choose>
        <xsl:when test="//FILE/REC[@NAME=Otto'] or //FILE/REC[@NAME='Jenny']>Venn</xsl:when>
        <xsl:otherwise>Kontakt</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
 
    <xsl:template match="/">
...
 
 
 
Nå er variabelen $TypeKontakt tilgjengelig i hele stylesheetet.
 
Tilsvarende vil en variabel som blir deklarert i en xsl:choose kun være tilgjengelig innenfor den, i en xsl:template kun innenfor den osv.
 
 
 
Parametre:
 
 
Her er et eksempel på hvordan kalle et template med en parameter
koden viser en liste over linker/bokmerker på en side, og det bokmerket som er aktivt får en egen style, mens de andre blir vanlige linker:
 
     <xsl:call-template name="Linker">
         <xsl:with-param name="Aktiv">Dekninger</xsl:with-param>
        </xsl:call-template>
 
 
Templatet linker er så definert slik:
<xsl:template name="Linker">
    <xsl:param name="Aktiv">Person</xsl:param>
    ....
 
 
Variabelen $Aktiv er nå klar for bruk inni templaten
...<xsl:choose>
    <xsl:when test="@ID=$Aktiv">
osv.
 
 
 
 
Komplett XSL for denne funksjonen:
(merk at denne bruker funksjonen node-set som er en extension. Se forrige post for hvordan sette opp denne..)
 
 
 <xsl:template name="Linker">
    <xsl:param name="Aktiv">Person</xsl:param>
   
 

    <xsl:variable name="linkertrygghet">
      <link ID='Person'>Personopplysninger</link>
      <link ID='Dekninger'>Dekninger</link>
      <link ID='Begunstigelse'>Begunstigelse</link>
      <link ID='Pantsettelse' >Pantsettelse</link>
      <link ID='Innbetaling' >Innbetaling</link>
      <link ID='Avtalegiro' >Avtalegiro</link>
      <link ID='Raadgiver' >Rådgiver</link>
    </xsl:variable>
 

    <xsl:variable name="linkerforening">
      <link ID='Person'>Personopplysninger</link>
      <link ID='Innbetaling' >Innbetaling</link>
      <link ID='Avtalegiro' >Avtalegiro</link>
      <link ID='Raadgiver' >Rådgiver</link>
    </xsl:variable>
 
    <xsl:variable name="linkerspar">
      <link ID='Person'>Personopplysninger</link>
      <link ID='InnLiv'>Innbetaling</link>
      <link ID='UtLiv'>Utbetaling</link>
      <link ID='BegunstLiv'>Begunstiget</link>
      <link ID='Avtalegiro'>Avtalegiro</link>
      <link ID='Raadgiver'>Rådgiver</link>
    </xsl:variable>
 
 
 

    <xsl:choose>
      <xsl:when test="$TypeProdukt='Trygghet'">
        <xsl:call-template name='laglinker'>
          <xsl:with-param name='Aktiv' select='$Aktiv'></xsl:with-param>
          <xsl:with-param name='linker' select='$linkertrygghet'></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="$TypeProdukt= 'Forening'">
        <xsl:call-template name='laglinker'>
          <xsl:with-param name='Aktiv' select='$Aktiv'></xsl:with-param>
          <xsl:with-param name='linker' select='$linkerforening'></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="$TypeProdukt = 'Spar'">
        <xsl:call-template name='laglinker'>
          <xsl:with-param name='Aktiv' select='$Aktiv'></xsl:with-param>
          <xsl:with-param name='linker' select='$linkerspar'></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
    </xsl:choose>
 
 
 
  </xsl:template>
 

  <!-- lag linker basert på liste over linker i param-->
  <xsl:template name="laglinker">
    <xsl:param name="Aktiv">Person</xsl:param>
    <xsl:param name="linker"></xsl:param>
 
    <xsl:for-each select="msxsl:node-set($linker)/link">
      <xsl:choose>
        <xsl:when test="@ID=$Aktiv">
          <span class="aktiv">
            <xsl:value-of select="."/>
          </span>
        </xsl:when>
        <xsl:otherwise>
          <a>
            <xsl:attribute name="href">
              #<xsl:value-of select="@ID" />
            </xsl:attribute>
            <xsl:value-of select="."/>
          </a>
 
        </xsl:otherwise>
      </xsl:choose>
 

    </xsl:for-each>
 
  </xsl:template>
 
 
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment