Welcome Message

"The difference between a successful person and others is not a lack of strength,
not a lack of knowledge, but rather a lack in will."
-Vince Lombardi

November 24, 2009

Use of Indexes in Foreign Key

Normally we used to avoid creating indexes in the foreign keys, with unindexed foreign

key columns; Oracle will lock the child table

WHEN TO INDEX:

In addition to the table lock issue that might hit you, an unindexed foreign key
is bad in the following cases as well:
 
à When you have an on delete cascade and have not indexed the child table. 
   For example EMP is child of DEPT. 
   Delete deptno = 10 should cascade to EMP.
   If deptno in emp is not indexed, you will get a full table scan of EMP.
This full scan is probably
   undesirable and if you delete many rows from the parent table,
the child table will be scanned once for each parent row deleted.
 
à When you query from the PARENT to the CHILD.  
  Consider the EMP, DEPT example again. It is very common to query the EMP table
in the context of a deptno.
  If you frequently query:
  
     select * from dept, emp
     where emp.deptno = dept.deptno and dept.deptno = :X;
 
 to generate a report or something, you'll find not having the index in place
will slow down the queries.
 
WHEN NOT TO INDEX:
 
So, when do you NOT need to index a foreign key?  In general when the following
conditions are met:
 
à You do NOT delete from the parent table. (Especially with delete cascade)
 
à You do NOT update the parent table’s unique/primary key value.
 
à You do NOT join from the PARENT to the CHILD (like DEPT->EMP).
 
If you satisfy all three above, feel free to skip the index, it is not needed.
If you do any of the above, be aware of the consequences.
 
As for the effect of an index on a foreign key index on an OLTP system
-- it depends.
If you not update the foreign key the overhead is during the insert
and might not be noticed. If you update it frequently, it might be worse

We will go through the following example which is having the delete statement which deletes from the parent table which is having a reference with the child table.

Example without index on child table

-----------------------------------------------------------------------------

-- Create a Parent Table.

CREATE TABLE PARENT(NO NUMBER);

-- Insert some sample data in to the Parent table.

INSERT INTO PARENT(NO) SELECT ROWNUM FROM ALL_OBJECTS WHERE ROWNUM < 10001;

COMMIT;

-- Add Primary Key Constraint to it.

ALTER TABLE PARENT ADD CONSTRAINT PARENT_PK PRIMARY KEY (NO);

-- Create a Child table.

CREATE TABLE CHILD(NO NUMBER,NAME VARCHAR2(10));

-- Insert some sample records wit the value from the parent table

INSERT INTO CHILD(NO,NAME)

SELECT A.NO,A.NAME FROM

(SELECT NO,'RAFEEK' AS NAME FROM PARENT WHERE ROWNUM < 10000)A, (SELECT 1 FROM DUAL

UNION ALL

SELECT 2 FROM DUAL);

-- Commit the transaction

COMMIT;

-- Add foreign key constraint to it.

ALTER TABLE CHILD ADD CONSTRAINT REFPARENT FOREIGN KEY (NO) REFERENCES PARENT (NO);

-- Analyze both the tables (Gather Statistics)

ANALYZE TABLE CHILD COMPUTE STATISTICS;

ANALYZE TABLE PARENT COMPUTE STATISTICS;

--NOW WE WILL CHECK THE PERFORMANCE PROBLEM

-- delete All the records from the child table

DELETE FROM CHILD;

COMMIT;

ANALYZE TABLE CHILD COMPUTE STATISTICS;

--TO CAPTURE THE TIMING

SET TIMING ON

--DELET FROM THE PARENT TABLE

DELETE FROM PARENT;

COMMIT;

SET TIMING OFF

--NOTE DOWN THE TIME TAKEN

---------------------------------------------------------------------------

Example with Index on child table

DROP TABLE CHILD;

DROP TABLE PARENT;

CREATE TABLE PARENT (NO NUMBER);

INSERT INTO PARENT (NO) SELECT ROWNUM FROM ALL_OBJECTS WHERE ROWNUM < 50001;

COMMIT;

ALTER TABLE PARENT ADD CONSTRAINT PARENT_PK PRIMARY KEY (NO);

CREATE TABLE CHILD (NO NUMBER, NAME VARCHAR2 (10));

INSERT INTO CHILD (NO, NAME)

SELECT A.NO, A.NAME FROM

(SELECT NO,'RAFEEK' AS NAME FROM PARENT WHERE ROWNUM < 10000)A, (SELECT 1 FROM DUAL

UNION ALL

SELECT 2 FROM DUAL);

COMMIT;

ALTER TABLE CHILD ADD CONSTRAINT REFPARENT FOREIGN KEY (NO) REFERENCES PARENT (NO);

CREATE INDEX CHILD1_IX ON CHILD (NO);

ANALYZE TABLE CHILD COMPUTE STATISTICS;

ANALYZE TABLE PARENT COMPUTE STATISTICS;

ANALYZE INDEX CHILD1_IX COMPUTE STATISTICS;

DELETE FROM CHILD;

COMMIT;

ANALYZE TABLE CHILD COMPUTE STATISTICS;

SET TIMING ON

DELETE FROM PARENT;

COMMIT;

SET TIMING OFF

--NOTE DOWN THE TIME TAKEN

Thanks & Regards,

Mohamed Rafeek, S

November 23, 2009

SQL DBO SQL Server Database Object Owner dbo

Who is "dbo?

There are two "dbo" in SQL Server, one is Database Owner and one is Database Object Owner, dbo is a user with permissions to perform all activities in a database. Each database has this special user called dbo, user dbo cannot be deleted and is always present in every database. Database owners and object owners have no separate logins the user dbo is part of sysadmin fixed role or db_owner fixed database role. Any objects created by members of the sysadmin fixed server role (or by the dbo user) belong to dbo.

Objects created by any other user who is not also a member of the sysadmin fixed server role including members of the db_owner fixed database role belong to the user creating the object, not dbo. The creator of an object is granted all permissions implicitly but must give explicit permissions to other users before they can access the object. When accessing objects an owner name should be qualified before object name like "object_owner.object_name"

SELECT * FROM Object_Owner.Table_Name

If object owner is not specified when referencing the object then SQL Server looks for objects owned by current user and then objects owned by dbo, if the object is not owned by current user or dbo then object owner must be specified other wise an error will occur. Windows NT users and groups can be owner of objects. If you want to remove a database owner from current database the objects owned must be dropped or ownership must be changed.

Check these two stored procedures in books online.

sp_changeobjectowner
sp_changedbowner

 

September 22, 2009

Introduction about SLD, Integration Builder and SC


Session 2: Intro about SLD, Integration Builder and SC


As we know we will have different type of environments in corporate like development, QA and production. So we will have SAP in bunch of servers for each environment which is known as SLD (system landscape directory). The different client codes in each environment represent sub systems in it. For ex: one Dev system may be there which has 100 client code for UAT, 210 for exec etc., We will have different R/3 servers and XI servers. An R/3 Server will have an ABAP engine with small portion of J2EE engine to communicate with XI servers and vice - versa.

We can use SAPGUI for logging in to any of the systems (R/3 or XI). Each and every thing in SAP will have some unique code which can be used directly for opening it. So for accessing Integration Builder we need to type "sxmb_ifr" code in transaction field.

Integration Builder is of two views. They are Design (Integration Repositary) and Configuration (Integration DIrectory). Integration Builder is developed in Java Web Start and it runs in J2EE engine. For creating any objects we use Design: Integration Builder (IR) and these are some thing like Raw objects but it will be configured and structured in Configuration: Integration Builder (ID).

For Ex:

When a Function imported from R/3 in to XI as a web service it will automatically create JNI, EJB, Servlet and Web service for it. After that it will be in IR. We will configure it in ID as scenarios like VB to SAP etc in structured manner.

Software Component is a logical unit of any release. For example you want to release this place order function as software then just build it and release as a software component which can be distributed across. SAP GUI is a software component.

Shortly,

1. SLD is a System landscape directory where SAP resides

2. Integration Repository is Design: Integration Builder and Integration Directory is Configuration: Integration Builder which is for creating objects and configuring it for usage.

3. Software Component is a logical unit of any release.

September 18, 2009

Easy start steps for developing a Blackberry application.

1. Download the development tool and install it

 You can download the JDE which is provided by RIM to develop Blackberry applications. The other option is the eclipse plug in which can also be used to develop Blackberry applications.

2. Open the JDE and create a new workspace. 

3. Create a new project in this workspace.

4. Now you can add classes to this project and build the application by clicking the Build menu item in the menu bar.

5. Once the project is build the JDE creates some files in the build folder.

6. If the build is successful then you can run the application in the simulator by pressing the F5 key of your keyboard or by clicking the Build All and Run in the Build menu item in the menu bar.

7. By default a simulator is already selected by the JDE and opens the simulator.

8. On the simulator you can find many icons of different applications which are already available.

9. Search for your particular project name (usually a black icon) with the project name you have given will be available.

10. Clicking on this icon will run the application.

Configuring MDS for accessing network through the simulator

In order to access intranet or internet from the simulator of the Blackberry we need to run the Mobile Data Service (MDS). The MDS comes along with the JDE or we can download it separately. If you are inside a intranet then you need to set the proxy correctly in the MDS. To set the proxy settings follow the below steps:

1. Go to MDS folder

2. Next go to Config folder

3. You willfind a file called rimpublic.property

4. In # [HTTP HANDLER] change the proxies enabled to True and change the proxy host and the proxy port.

 

Blackberry device, Blackberry Enterprise Server and the Network Operation Center of RIM

Blackberry Enterprise Server and the Network Operation Center of RIM

Here I have given little information about the Blackberry device, Blackberry Enterprise server and the Network Operation Center of Research In Motion.

We know that a blackberry device when configured with the intranet network of an organization can receive emails being pushed from the intranet mail server. The push option of the blackberry will notify you whenever a new mail comes in the blackberry or a meeting request comes is one of the important features of this device. The under given paragraph explains how the whole the Blackberry device the Back end Blackberry Enterprise server and the Network Operation Center of RIM works together.

Every enterprise which has a Blackberry infrastructure has a Blackberry Enterprise Server (BES). The BES is a server which can talk to the Micros soft Exchange Server or lotus Domino of the enterprise to retrieve the mails. Once a mail comes in the mail exchange server of a enterprise the mail is retrieved by the BES server and then sent it to the NOC of RIM. The NOC is the data center where all the mails or data transfer between the BES and the Blackberry device passes through. There are two NOC of RIM one is in Canada and the other one in US. From the NOC the emails will be transferred to the appropriate devices. One of the main advantages for using the NOC is the security advantage; all the traffic between the BES is encrypted using triple DES as it travels through the NOC. And because all the traffic goes through the NOC before being routed to the BES, the BES accepts incoming transactions from only one location that is the NOC thus receiving only trusted data. Some other smart phones accept incoming transactions from the internet which makes it exposed to receive untrusted data.

Blackberry and SAP

Research In Motion (RIM) and SAP® are making SAP Customer Relationship Management (SAP CRM) available virtually anywhere, anytime. 

Read the full information here:

http://uk.blackberry.com/solutions/needs/intelligence/sap.jsp

http://na.blackberry.com/eng/campaign/SAPcampaign/

Simple way of connecting a Blackberry application to SAP

Connecting Java Applications for Blackberry to SAP Application

The most common way to connect a Blackberry application  to a SAP application is by using the standard HTTP protocol. As of now there is no API which is included by the RIM which allows the Blackberry application to directly talk to a SAP application. The work around to connect to a SAP application from a Blackberry application is to employ a back-end application which supports HTTP protocol. The flow of connection is as follows: 

          1. The Blackberry application sends data to the back-end application using HTTP POST

          2. It can retrieve data HTTP GET

          3. The Blackberry application can even synchronize data with the back-end application which handles the connection between itself and the SAP application.

The back-end application makes use of JCo to connect itself to the SAP application. Its a very good and a common way to pass all the data exchanged between the Blackberry application and the beck-end application in a form which can be parsed by both the applications. This will enable the back-end application to pass the data to and fro between the Blackberry application and the SAP application after parsing it in a form suitable by the SAP application.

 

September 17, 2009

Brief introduction on R/3 System and NetWeaver

Session 1: Brief introduction on R/3 System and NetWeaver

 

SAP (Systems, Applications and Products in Data Processing) is basically an ERP system. SAP R/3 is three-tier Architecture with Presentation, Business and Data logic.

 

They are written in ABAP programming language and it uses Open SQL for connecting to data logic. We have some other ERP systems like JDEdwards, Oracle Fusion, Concur etc for this but why we need to use SAP?

 

Then SAP came with new integrated platform for everything that is SAP NetWeaver which has lot of this such as Portal, Process Integration, Business warehouse, Business intelligence etc which is written in J2EE and it supports all JCA connectors.

 

Now we use SAP R/3 engine installed in one server which is written in ABAP and we use SAP NetWeaver in another server which is written in J2EE and it is tightly coupled to R/3.

 

So, simply we can say R/3 is the emperor of SAP which controls others and anything you need it will be available in SAP R/3 which is customised to every business.

 

eXchange Infrastructure (XI) which is now Process Integration (PI) is developed in J2EE which supports all types of protocols and connectors which imports the functions from R/3 in a simple way for using it. It supports protocols such as SOAP, FTP, SFTP, NNTP etc., now days any third party system should connect to this XI for data which in some way connects to R/3.

 

SAP NetWeaver architecture contains mainly four blocks. They are People integration, Process Integration, Information Integration and Application Platform.

 

Learn more about SOAP and JCA for understanding next Session.

 

September 3, 2009

How to replace selected textarea value using javascript

1. // code for IE
2. var textarea = document.getElementById("textarea");
3.  
4. if (document.selection)
5. {
6. textarea.focus();
7. var sel = document.selection.createRange();
8. // alert the selected text in textarea
9. alert(sel.text);
10.
11. // Finally replace the value of the selected text with this new replacement one
12. sel.text = '<b>' + sel.text + '</b>';
13. }
14.  
15.  
16.  
17. // code for Mozilla
18.  
19. var textarea = document.getElementById("textarea");
20.
21. var len = textarea.value.length;
22. var start = textarea.selectionStart;
23. var end = textarea.selectionEnd;
24. var sel = textarea.value.substring(start, end);
25.
26. // This is the selected text and alert it
27. alert(sel);
28.
29. var replace = '<b>' + sel + '<b>';
30.
31. // Here we are replacing the selected text with this one
32. textarea.value = textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);

August 20, 2009

Regarding OutOfMemoryError: PermGen space

Every time we make a new build and redeploy it in JBOSS and after a few such redeployments it throws the below error

 

java.lang.OutOfMemoryError: PermGen

 

And we need to restart JBOSS.

 

Excerpt from links:

 

In Sun JVM, garbage-collection of Java Heap is managed in generations (memory segments holding objects of different ages- Young Generation, Tenured Generation and Permanent Generation).  Garbage collection algorithms in each generation are different.

 

The permanent generation holds data needed by the virtual machine to describe objects that do not have equivalence at the Java language level. For example objects describing classes and methods are stored in the permanent generation.

Applications with large code-base can quickly fill up this segment of the heap which will cause java.lang.OutOfMemoryError: PermGen

We can increase the PermGen (Permanent Generation) size in JVM, but this just delays the error and cannot get rid of it.

 

To tackle this, posts suggest two options:

  1. Restart the JBOSS every time we redeploy.
  2. Change the Sun JVM to some other JVM.

 

Links also suggests JRockit JVM as it doesn’t have a PermGen area and can never throw this error.

 

I had just did some search, I don’t know if we are supposed to change the JVM or not.

But that is what I came across on the net.

 

Links for your reference…

 

These links also say that after a few redeployments, JBOSS console shows up this error.

 

http://blog.yannis-lionis.gr/?p=8

http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#1.1.%20Generations|outline

 

July 23, 2009

Managing Windows XP Services locally/remotely using Service Controller Command SC

General Starting and Stopping the service can be accomplished using the

net stop <service name>

net start <service name>

 

A full list of the exact services is found in the registry (run regedit.exe) under the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services key.

 

Alternatively, you can perform the stop and start using the name that is showed in the Services Control Panel applet by putting the name in quotes, i.e.

net stop "<service>"

net start "<service>"

 

 

Managing Windows XP Services with the Service Controller Command SC

 

The Service Controller utility SC is a powerful command-line utility for managing Windows services. Its various capabilities and functions are discussed here.

Many processes and functions of the Windows XP operating system and other software are classified under the general rubric of “services”. Managing services with the graphical facility called the Services Console is discussed at a sister site. In addition to a GUI method of managing services, Windows XP also has a powerful command-line utility.This utility, the Service Controller, is opened by entering "sc' into the command prompt and contains a large assembly of subcommands that we will survey.

 

The command-line method of managing services has the advantage of being available for scripts. It also allows for quickly stopping and starting services for troubleshooting purposes. Systems administrators use it for managing services on networks and for very detailed configuration. For the average PC user, it provides a quick and easy way to turn services on and off to see how system performance is affected.

 

 

DESCRIPTION:

        SC is a command line program used for communicating with the NT Service Controller and services.

 

Service Control - Create, Start, Stop, Query or Delete any Windows SERVICE. The command options for SC are case sensitive.

 

Syntax

      SC [\\server] [command] [service_name] [Options]

 

Key

   server       : The machine where the service is running

 

   service_name : The KeyName of the service, this is often but not always the same as the DisplayName shown in Control Panel, Services. You can get the KeyName by running: SC GetKeyName <DisplayName>

 

USAGE:

        sc <server> [command] [service name] <option1> <option2>...

 

        The option <server> has the form "\\ServerName"

        Further help on commands can be obtained by typing: "sc [command]"

        Commands:

          query-----------Queries the status for a service, or

                          enumerates the status for types of services.

          queryex---------Queries the extended status for a service, or

                          enumerates the status for types of services.

          start-----------Starts a service.

          pause-----------Sends a PAUSE control request to a service.

          interrogate-----Sends an INTERROGATE control request to a service.

          continue--------Sends a CONTINUE control request to a service.

          stop------------Sends a STOP request to a service.

          config----------Changes the configuration of a service (persistant).

          description-----Changes the description of a service.

          failure---------Changes the actions taken by a service upon failure.

          sidtype---------Changes the service SID type of a service.

          qc--------------Queries the configuration information for a service.

          qdescription----Queries the description for a service.

          qfailure--------Queries the actions taken by a service upon failure.

          qsidtype--------Queries the service SID type of a service.

          delete----------Deletes a service (from the registry).

          create----------Creates a service. (adds it to the registry).

          control---------Sends a control to a service.

          sdshow----------Displays a service's security descriptor.

          sdset-----------Sets a service's security descriptor.

          showsid---------Displays the service SID string corresponding to an arbitrary name.

          GetDisplayName--Gets the DisplayName for a service.

          GetKeyName------Gets the ServiceKeyName for a service.

          EnumDepend------Enumerates Service Dependencies.

 

        The following commands don't require a service name:

        sc <server> <command> <option>

          boot------------(ok | bad) Indicates whether the last boot should

                          be saved as the last-known-good boot configuration

          Lock------------Locks the Service Database

          QueryLock-------Queries the LockStatus for the SCManager Database

 

EXAMPLE:

        sc start MyService

 

Would you like to see help for the QUERY and QUERYEX commands? [ y | n ]: y

QUERY and QUERYEX OPTIONS :

        If the query command is followed by a service name, the status

        for that service is returned.  Further options do not apply in

        this case.  If the query command is followed by nothing or one of

        the options listed below, the services are enumerated.

    type=    Type of services to enumerate (driver, service, all)

             (default = service)

    state=   State of services to enumerate (inactive, all)

             (default = active)

    bufsize= The size (in bytes) of the enumeration buffer

             (default = 4096)

    ri=      The resume index number at which to begin the enumeration

             (default = 0)

    group=   Service group to enumerate

             (default = all groups)

 

SYNTAX EXAMPLES

sc query                - Enumerates status for active services & drivers

sc query messenger      - Displays status for the messenger service

sc queryex messenger    - Displays extended status for the messenger service

sc query type= driver   - Enumerates only active drivers

sc query type= service  - Enumerates only Win32 services

sc query state= all     - Enumerates all services & drivers

sc query bufsize= 50    - Enumerates with a 50 byte buffer.

sc query ri= 14         - Enumerates with resume index = 14

sc queryex group= ""    - Enumerates active services not in a group

sc query type= service type= interact - Enumerates all interactive services

sc query type= driver group= NDIS     - Enumerates all NDIS drivers

 

Examples for remote sc commands:

 

sc \\ie10nt3ksvm069 query type= service state= all >> C:\allprocesses.txt

 

sc \\ie10nt3ksvm069 getkeyname "DNS Client"

 

sc \\ie10nt3ksvm069 getdisplayname "Dnscache"

 

sc \\ie10nt3ksvm069 qc "Dnscache"

 

sc qc "Dnscache"

 

SC query messenger | FIND "STATE"

 

SC QUERY state= all |FINDSTR "DISPLAY_NAME STATE"

 

SC QUERY state= all |FINDSTR "SERVICE_NAME DISPLAY_NAME STATE"

 

NOTE: Be sure to check the spaces state= all it should not be state=all or state = all or state =all

 

Examples:

 

 SC GetKeyName "task scheduler"

 SC GetDisplayName schedule

 SC start schedule

 SC QUERY schedule

 SC QUERY type= driver

 SC QUERY state= all |findstr "DISPLAY_NAME STATE" >svc_installed.txt

 SC \\myServer CONFIG myService obj= LocalSystem password= mypassword

 SC CONFIG MyService binPath=c:\myprogram.exe obj=".\LocalSystem" password=""  Watch out for extra spaces:

SC QUERY state= all Works

SC QUERY sTate =all Fails!

 

How to get the current date and time in excel

If you want to get the current date and time in a cell then you can do one of the following:

1. To get the current date only use the TODAY() function.

Syntax

=TODAY()

2. To get the current date and time use the NOW() function.

Syntax

=NOW()

3. To get the current time only use the NOW() function, and then format the cell to display time only.

Note:

The TODAY() and NOW() functions will update the date and time whenever the worksheet is calculated. I.e. their values are variable.

To insert static date and/or time in a cell:

1. For current date: Select a cell, press CTRL then enter “;” (semicolon character).

2. For current time: Select a cell, press CTRL+SHIFT then enter “;”.

3. For current date and time: Select a cell, press CTRL then enter “;” to get the date. Enter SPACE, press CTRL+SHIFT then enter “;” to get the time.

You can also use Copy/Paste special. For example to To insert static date and time in a cell:

1. Enter “=NOW()” in a cell and hit enter. You will get the current date and time

2. Right click on the cell and select Copy.

3. Right click on the same cell and select Paste Special, then select Paste Values.

 

July 20, 2009

Google Search Tip - Filter Google Results Datewise or Weekwise or Monthwise or Yearwise

Filter Google Results Datewise/Weekwise/Monthwise/Yearwise

 

Filtering Google searches by time periods is one of the many hidden features of Google. By manipulating the search URL, you can trigger Google’s filter by data dropdown box to appear. With this drop down box, you can easily select what time dates you want Google to filter the results.

 

I often want to search for updated news on a common search term. For example, say you wanted to search for Site4Sites news for the last 24 hrs. Using this little Google hack, you can focus your search over whichever time period you want.

 

First go to http://www.google.com and search for your search term. I'm going to use "Site4Sites" as my example.

 

Obviously, I receive the highest ranked searches all-time for Site4Sites.

 

First Window: - http://www.google.com/search?hl=en&q=Site4Sites&btnG=Google+Search

 

Next, Open New window, just add &as_qdr=d to the end of the URL and press ENTER.

 

Second Window: - http://www.google.com/search?hl=en&q=Site4Sites&btnG=Google+Search&as_qdr=d   NOW COMPARE

 

Note: - Just change the =d to d5 for 5 days, or w5 for five weeks, or y5 for 5 year, etc.

 

 

 

Dynamic Javascript Insertion using javascript

Fortunately, dynamic insertion of CSS or Javascript is relatively painless.

var headID = document.getElementsByTagName("head")[0];               
var newScript = document.createElement('script');                   
newScript.type = 'text/javascript';                                 
newScript.src = 'http://www.somedomain.com/somescript.js';          
headID.appendChild(newScript);                                      
               

It's really that simple. headID gets the <head> element of the page. Next we create a new 'script' element, assign it a text/javascript type, and then the url of the script (which can be anywhere on the net since it's basically a javascript include). Finally we append the new element to our head section where it is automatically loaded.

If you're loading an external javascript and you need to know when the script has loaded you can simply use .onload=yourfunction; to set up the onload handler. Here's an example.

var headID = document.getElementsByTagName("head")[0];                
var newScript = document.createElement('script');                   
newScript.type = 'text/javascript';                                 
newScript.onload=scriptLoaded;                                      
newScript.src = 'http://api.flickr.com/?tags=sunset&format=json';   
headID.appendChild(newScript);                                      

Now when this script has been loaded the .onload event will call a function named scriptLoaded().

 

Dynamic Cascading Style Sheets using Javascript

The usefulness of being able to dynamically load a style sheet is fairly limited, but there is one very good reason to keep this tool handy: it lets you load a specific stylesheet for a specific browser. Instead of having one massive style sheet for every browser which visits your page, you can break out the stylesheets into browser specific Firefox, IE, Safari, Opera, etc styles which accommodate the eccentricities of each browser and let you serve smaller css files to your visitors to boot.

The code for this is just as simple as the javascript.

var headID = document.getElementsByTagName("head")[0];       
var cssNode = document.createElement('link');               
cssNode.type = 'text/css';                                  
cssNode.rel = 'stylesheet';                                 
cssNode.href = 'FireFox.css';                               
cssNode.media = 'screen';                                   
headID.appendChild(cssNode);                                 
                              

We get the <head> tag, then create the link and apply the attributes. When it's all set up we insert the new cssNode into the head section of our webpage where the various styles are instantly applied.

A complete reference for adding, creating, altering and deleting stylesheets and their elements can be found in a newer article titled Totally Pwn CSS with Javascript. If you are looking to do more than dynamically add a stylesheet you should definitely check out this article.