Search and Replace SQL Server 2005+

Zo eindelijk een search en replace functie gevonden voor SQL server 2005+ die geen tijdelijke tabellen en cursors gebruikt:


UPDATE TableName
SET DBTextField = REPLACE(CAST(DBTextField AS varchar(MAX)), 'SearchText', 'ReplaceText')
FROM TableName
WHERE CHARINDEX('SearchText',CAST(DBTextField as varchar(MAX)))>0 

ASP.NET client-side Page.IsValid

Als je client-side de Page.IsValid property client-side wil controlleren kan de globale variabele “Page_IsValid” worden gebruikt.

om de client-side pagina validatie uit te voeren kan de functie “Page_ClientValidate();” worden aangeroepen.


Page_ClientValidate();

if (Page_IsValid ) {
//some JS
}

Meer informatie op msdn.

‘A connection could not be made to the report server’

Deze fout wordt ontstaat wanneer er een verkeerde TargetServerURL in the Business Intelligence (BI) project is gezet van Reporting Services applicatie.

Controleer de  TargetServerURL in het property scherm van je BI project. Check dat deze URL verwijst naar de ReportServer virtual directory en niet naar de Reports virtual directory (wat vaak de oorzaak is van deze fout).

bijvoorbeeld http://Mijnserver/ReportServer$SQL2005DEV/ en niet http://Mijnserver/Reports$SQL2005DEV/

Moet een website er in elke browser hetzelfde uitzien?

Een interessante kijk op browser support:

If a web browser is defective, causing errors in the display or performance of the page, should the page developer struggle to hide the browser’s defects, or should the defects be revealed in hope of creating market pressure to force the browser maker to make good? By which approach is humanity better served?

Voor steeds groter groeiende groep webdevelopers is dit antwoord nee.

Ik ben het wel eens met de auteur van het gelinkte artikel. Zijn mening is wat gematigder dan de quote hierboven. Op de vraag “Als je met de CSS3 tag “box-shadow” de look en feel van een site drastisch kan verbeteren maar deze wordt niet ondersteund door IE, zou je deze dan toepassen?”. Zijn antwoord hierop: Ja.

Het idee hierbij is dat gebruikers die een browser gebruiken die deze tag wel toepassen zien de versie met schaduw. Gebruikers die een browser gebruiken die de tag niet ondersteund, zien de schadow niet, maar weten eigenlijk ook niet wat ze missen. En functioneel gezien is de website hetzelfde.

Ik kan me hier goed in vinden. Tevens biedt het webdevelopers de mogelijkheid  te experimenteren met de nieuwe mogelijkheden van CSS 3 en op zo dus de vooruitgang op webgebied te stimuleren. Want als we moeten wachten totdat alle browser CSSs 3 ondersteunen dan zitten we over 5 jaar nog steeds te klooien met CSS 1.en hack om de boel te laten werken in IE.

Vertical text in non-IE browsers.

Het tonen van verticale tekst via CSS is alleen weggelegd voor IE Browsers middels de volgende CSS3 regels:


writing-mode: tb-rl;
filter: flipv fliph;

Dit is een mooie manier om bijvoorbeeld tabel headers verticaal weer te geven. Maar helaas wordt deze CSS regel tot nu toe alleen toegepast in IE browsers. Om dit ook in non-IE browsers mogelijk te maken, gebruikt men vaak dynamisch gegenereerde images met de gewenste tekst.

Dit werkt natuurlijk ook maar het zorgt wel voor extra belasting op de webserver, tevens is dit lastig te onderhouden. Op zoek naar een betere oplossing, kwam ik een oplossing tegen die gebruik maakt van een statisch svg object met daarin een javascript welke de verticale text zet. Dit is al een betere oplossing alleen het aanroepen van de javascript binnen het svg object is niet erg netjes. Daarnaast moet op elke plek waar je verticale tekst wil gebruiken de svg toevoegen via de <embed> tag.

De oplossing voor dit probleem heb ik gevonden door met behulp van de jQuery SVG plugin deze svg zelf te genereren:


function SetVerticalText() {
    var verticalTexts = $(".verticalText");

    verticalTexts.each(function() {
        var text = $(this).text();
        $(this).text("");

        if (!$.browser.msie) {
            $(this).append("<div class='svgContainer'></div>");
            $(this).find(".svgContainer").svg();
            var svg = $(this).find(".svgContainer").svg('get');
            svg.text(null, -48, 12, text, { transform: 'rotate(270, 50, 50)', 'font-family': 'Arial', 'font-size': '10', 'letter-spacing': '2' });
        }
        else {
            $(this).append("<span class='verticalTextSpan'>" + text + "</span>");
        }
    });
}

Hier bij geef ik alle tekst elementen die ik verticaal wil weergeven de CSS class .verticalText bijvoorbeeld in mijn table headers:


<table cellpadding="0" cellspacing="0" class="statusTable width700" >
<tr>
<td class="labelCell">
NFP-SC
</td>
<td class="verticalText">
Digitaal initieel
</td>
<td class="verticalText">
Digitaal ingediend
</td>
<td class="verticalText">
Papier ingediend
</td>
<td class="verticalText">
Direct afgewezen
</td>
</tr>
</table>

Wanneer ik nu de SetVerticalText() aanroep, wordt er voor alle non-IE browsers een <div class=’svgContainer’></div> toegevoegd. Vervolgens wordt er middels de jQuery SVG plugin een svg object aangemaakt met daarin de verticale tekst.

Voor IE-browsers wordt er een <span class=’verticalTextSpan’></span> tag toegevoegd met daarin de verticale tekst.

Een demo van deze techniek.

svgDemo Source (10)

Invalid column name ‘DesktopHtml’

In het pre DNN 5 tijdperk, maakten veel mensen gebruik van de ’search and replace’ stored procedure van het  bi4ce forum. In  DNN 5 zijn er een aantal velden waarin de content wordt opgeslagen hernoemd (’DesktopHtml’ verandert in ‘Content’) waardoor deze stored procedure niet meer werkt.

Hieronder staat de aangepaste SP voor DNN 5:


CREATE Procedure Replace_Content(
@For as varchar(100),
@With as varchar(100))
AS
--* REPLACES TEXT IN THE DESKTOP HTML MATCHING THE FOR VARIABLE
--* SAMPLE: Replace_Content '/Portals/0/', ''

--* MAIN DECLARATION
DECLARE
@pointer binary(16),
@index INT,
@lenFor INT,
@lenWith INT,
@diff int,
@id INT,
@count INT

--* STANDARD RUNTIME VARIABLES
SET @lenFor = LEN(@For)
SET @diff = @lenFor - LEN(@With)

--* CREATE THE TEMPORARY TABLE
CREATE TABLE #Temporary
(
[id] int,     --MAPS TO YOUR SOURCE TABLE PKID
[oldtext] text, --ORIGINAL SOURCE TEXT (NOT REQUIRED)
[oldlength] int,--ORIGINAL SOURCE LENGTH
[text] text,     --NEW TEXT VALUE
[length] int,     --NEW LENGTH
[cLength] int    --CHECKSUM LENGTH
)

--* LOOP THROUGH THE SOURCE TABLE
--* IDENTIFY ALL RECORDS WHICH MATCH YOUR PATTERN
DECLARE irows CURSOR
LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
SELECT moduleid
FROM HtmlText
WHERE PATINDEX('%'+@For+'%', Content)>0
OPEN irows

FETCH NEXT FROM irows INTO @id

WHILE (@@FETCH_STATUS = 0)
BEGIN
--* INSERT MATCHING RECORDS INTO THE TEMPORARY TABLE
INSERT INTO #Temporary(id, oldtext, oldlength, text)
SELECT
ModuleID,
Content,
datalength(Content),
Content from HtmlText
where ModuleID = @id

--* GRAB THE POINTER OF THE OBJECT TO BE USED FOR UPDATETEXT
SELECT
@pointer = TEXTPTR(text)
FROM #Temporary
WHERE id=@id
--* GET THE FIRST INDEX OF OUR PATTERN
SELECT
@index = PATINDEX('%'+@For+'%', text)
FROM #Temporary
WHERE id=@id

--* IF WE FOUND ANY ENTRIES, LOOP UNTIL WE REPLACE ALL OF THEM
IF @index > 0
BEGIN
select @count = 0
WHILE (
SELECT
PATINDEX('%'+@For+'%', text)
FROM #Temporary
WHERE id=@id
) > 0
BEGIN
--* KEEP A RUNNING TOTAL OF IDENTIFIED ENTRIES FOR LENGTH CHECKSUM
select @count = @count + 1
SELECT
@index = PATINDEX('%'+@For+'%', text)-1
FROM #Temporary
WHERE id=@id

--* UPDATE THE TEMPORARY VALUE
UPDATETEXT #Temporary.text @pointer @index @lenFor @With
END
--* UPDATE THE TEMPORARY RECORD, SET LENGTH AND CLENGTH VALUES FOR CHECKSUM
UPDATE #Temporary set
length=datalength(text),
cLength=datalength(oldtext) - @count * @diff
WHERE id=@id
END
FETCH NEXT FROM irows INTO @id
END

CLOSE irows
DEALLOCATE irows
--* UPDATE THE DATABASE FOR ALL RECORDS IN THE TEMPORARY
--* WHERE THE CHECKSUM LENGTH MATCHED THE RESULT LENGTH
UPDATE target set
target.Content = t.[text]
FROM
HtmlText target JOIN #Temporary t
ON
target.ModuleId = t.id AND
t.length = t.cLength

--* DELETE ALL RECORDS FROM TEMPORARY WHICH WERE SUCCESSFUL
DELETE from #Temporary where length=clength

--* RETURN ALL ROWS WHICH FAILED LENGTH COMPARISON
--* THIS SHOULD ALWAYS BE EMPTY
select * from #Temporary

--* DROP THE TEMP TABLE AND EXIT
DROP TABLE #Temporary

DotNetNuke infinite redirect

dotnetnuke-logo.gif

Het fixen van de infinite redirect loop op een DotNetNuke site kan op de volgende manieren:

  1. De laatste slash verwijderen “/”, bijv www.example.com/. Verwijder de “/” om de loop te fixen.
  2. Verander de web.config en zet usePortNumber=”true” (In mijn geval runde de site op port 80 toch heeft deze setting de loop verholpen)

Ik had voor dat dit issue optrad nog een ander probleempje, er werdt verkeert geredirect, namelijk naar de portAlias van mijn development omgeving. Dit is te verhelpen door in de Tabel ‘PortalAlias’ de portAlias aan te passen naar de nieuwe portalAlias

Scalable CSS buttons

Meeschalende CSS buttons, het blijft een leuke uitdaging om dit voor elkaar te krijgen. De mooiste techniek die ik tot nu toe ben tegengekomen is deze van David’s Kitchen.

Hierin worden buttons en links met de .btn class via jQuery vervangen xhtml valide markup. Deze nieuwe  markup wordt vervolgens op gemaakt via een aantal CSS regels.

Het mooie van deze techniek is behalve dat de knoppen meeschalen met de tekst, de kleuren van de knop niet in de achtergrond image worden gezet maar gewoon via CSS classes. De kleur van de knoppen kan zo dus makkelijk worden aangepast.

The script failed to load. Inaccessible path.

In de AJAX Control Toolkit wordt nog niet afdoende rekening gehouden met browsers die gebaseerd zijn op Webkit (Safari 3+ en Chrome). Hierdoor kunnen deze browsers sommige AJAX Control Toolkit scripts niet uitvoeren. Gelukkig hebben de jongens van het ASP.NET forum

een workaround gevonden:

1. Plaats de volgende code in een safariHack.js bestand


Sys.Browser.WebKit = {}; //Safari 3 is considered WebKit
if( navigator.userAgent.indexOf( 'WebKit/' ) > -1 )
{
Sys.Browser.agent = Sys.Browser.WebKit;
Sys.Browser.version = parseFloat( navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
Sys.Browser.name = 'WebKit';
}

2. Voeg een reference toe aan je scriptmanager


<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/Scripts/Safari3AjaxHack.js" />
</Scripts>
</asp:ScriptManager>

Meerdere web.config versies is Visual Studio 2010

In de volgende versie van Visual Studio (2010) zal het mogelijk zijn meerdere web.config files te hanteren. Hierdoor kunnen we een web.config hanteren voor de ontwikkelomgeving en een web.config voor de productie omgeving. Aan de hand van de actieve configuratie wordt bepaald welke web.config wordt gebruikt.

multiplewebconfigfiles_1e368fca.png