Transmitting AufioFormat Class and sampled bytes
Hello everyone,
I am building an audio server of sorts. The objective is something like this: the client makes a request which comprises of the filename that it wants served, and the maximum network bandwidth it wants to use for this music. upon receipt of this request, the server reads the audio in uncompressed form and decides on choice of algorithm it employs to compress the audio (along with sampling rate, sample resolution), then it tells the client about the encoding scheme it's employing to compress the subsequent audio then sends the audio packet by packet in same encoding scheme, until the client decides to change it's bandwidth specification (thus quality). when this happen, the server re-decides on encoding scheme and process repeats until the whole audio is played out.
I have decided to run the server such that it creates a new thread for each client, and this thread handles the receipt of 'quality' packet and subsequent reading and compression. As of now i have already developed the classes that handle the various compression schemes, i have also written the codes for mutli-threaded server and client. (note: compression classes take raw bytes and compress them) and that's about it, rest of the job is yet to be done.
What is the best way to handle this type of applications? Is EJB required for this? how to go about doing this? what are the best ways to extract only the audio bytes from a file ( and not the data about it's encoding scheme) what classes store it? how to make client aware of decoding schemes?
PS: i'll provide any further relevant data and codes
{here's the snippets from my implementation for some important aspects:
my server which spawns new threads to serve.
{code} try {
ServerSocket serverSocket = new ServerSocket(902);
while (true)
new AudioServerThread(serverSocket.accept()).run();
} catch .. { }
the run method of the server thread: out = socket.getOutputStream();
in = socket.getInputStream(); //both these within try catch.
two methods in server thread ( write and read) handle the reading and writing to these streams and their error handling)
Sorry for the long winded post like this one.
thanks yet again, captfoss. i implemented many things u mentioned, it's working alright, but here, i'm hitting a roadblock that look like it'll be a big one ;-(.
let me explain all that i have done:
I have implemented the ServerServer class, which sits listening to requests to spawn new threads to services the client,
the run method in ServerThread looks like this: (all the risky statements are in appropriate try catch blocks and
SerializableAudioFormat is the class i taked about in prev post, it sends enough info over to the cleint for the client to re construct the audio format class )
out = socket.getOutputStream();
in = socket.getInputStream();soundFile = new File("C:\\welcome.wav");
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
audioFormat = audioInputStream.getFormat();
SerializableAudioFormat sf = new SerializableAudioFormat(audioFormat.getEncoding(), audioFormat.getSampleRate(), audioFormat.getSampleSizeInBits(), audioFormat.getChannels(), audioFormat.getFrameSize(), audioFormat.getFrameRate(), audioFormat.isBigEndian());
Write(getBytes(sf));
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
int nBytesRead = 0;
byte[] abData = new byte[Main.BUFFER]; // BUFFER is declared in Main class
//as a final integer 10*1024*1024 which is 10 mega bytes.
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0) {
this.Write(abData);
}and Write(byte[] b) wroks like with out.write(b) bmethod (out is o/p stream returned by the socket's getOutputStream() fn.)
the byte[] getBytes(Object obj) method works like this:
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
oos.close();
bos.close();
return bos.bos.toByteArray();////////////////////////////////
All the try catch statements are eliminatd for readability.
Client side a function playFromStream() works like this:
byte[] buf = new byte[Main.BUFFER]; // BUFFER is declared in Main class
//as a final integer 10*1024*1024 which is 10 mega bytes.
Encoding e = null;
if(this.Read(buf) ==0)
return;
SerializableAudioFormat sf = (SerializableAudioFormat) toObject(buf);
if (sf.int_encoding == 1)
e=Encoding.ALAW;
else if (sf.int_encoding == 2)
e=Encoding.PCM_SIGNED;
else if (sf.int_encoding == 3)
e=Encoding.PCM_UNSIGNED;
else if (sf.int_encoding == 4)
e= Encoding.ULAW;
audioFormat = new AudioFormat(e,
sf.sampleRate, sf.sampleSizeInBits,
sf.channels, sf.frameSize,
sf.frameRate, sf.bigEndian);
SourceDataLine line = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(audioFormat);
line.start();
int nBytesRead = 0;
while (nBytesRead != -1) {
nBytesRead = Read(buf );
System.out.println(nBytesRead);
if (buf.length == 0) {
System.out.println("done");
break;
} else {
line.write(buf, 0, nBytesRead);
line.drain();
line.close();Read function just reads from inputstream obtained from socket's getInpotStream() fn.
and toObject function works like this:
object = new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(bytes)).readObject();and this object is returned
the problem seems a little too big (pun unintended) when i run this program i get
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at audiostream.Client.<init>(Client.java:23)
at audiostream.Client.main(Client.java:35)
Java Result: 1
and when i decrease that buffer space to 1 MB the audio plays, but like a dog: I can hear a spasmodic fit that says "welcome to java multimedia programming", the audio plays in fits tht last about 500 milliseconds then halts for about a second and next 500ms plays and so on. The welcome.wav file is just 473KB and the whole audio lasts less than 3 seconds.
god save me, what do i do?
Similar Messages
-
Extra hardware interface for transmiting both Audio and video to client ??
hi i m doing e-learning project. i have to capture video from webcam and voice from headphone and send to client.
but my code is working fine for either one at a time.
DO i need some extra hardware interface for Transmitting both Audio and video to client im using code AVTransmit and AVReceive found from this site only
After running TX
i give dsound:// & vfw://0 in Media Locater only sound is received and no vedio
and when i give vfw://0 in Media Locater only live video is transmited.
im using JMF1.1.2e.
if any one know the method to run or cause of it plz reply me soon. i will be very thankfull
transmiter/server side code .first run TX on server
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.media.rtp.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
public class Tx extends JFrame implements ActionListener, KeyListener,
MouseListener, WindowListener {
Vector targets;
JList list;
JButton startXmit;
JButton rtcp;
JButton update;
JButton expiration;
JButton statistics;
JButton addTarget;
JButton removeTarget;
JTextField tf_remote_address;
JTextField tf_remote_data_port;
JTextField tf_media_file;
JTextField tf_data_port;
TargetListModel listModel;
AVTransmitter avTransmitter;
RTCPViewer rtcpViewer;
JCheckBox cb_loop;
Config config;
public Tx() {
setTitle( "JMF/RTP Transmitter");
config= new Config();
GridBagLayout gridBagLayout= new GridBagLayout();
GridBagConstraints gbc;
JPanel p= new JPanel();
p.setLayout( gridBagLayout);
JPanel localPanel= createLocalPanel();
gbc= new GridBagConstraints();
gbc.gridx= 0;
gbc.gridy= 0;
gbc.gridwidth= 2;
gbc.anchor= GridBagConstraints.CENTER;
gbc.fill= GridBagConstraints.BOTH;
gbc.insets= new Insets( 10, 5, 0, 0);
((GridBagLayout)p.getLayout()).setConstraints( localPanel, gbc);
p.add( localPanel);
JPanel targetPanel= createTargetPanel();
gbc= new GridBagConstraints();
gbc.gridx= 1;
gbc.gridy= 1;
gbc.weightx= 1.0;
gbc.weighty= 1.0;
gbc.anchor= GridBagConstraints.CENTER;
gbc.fill= GridBagConstraints.BOTH;
gbc.insets= new Insets( 10, 5, 0, 0);
((GridBagLayout)p.getLayout()).setConstraints( targetPanel, gbc);
p.add( targetPanel);
JPanel mediaPanel= createMediaPanel();
gbc= new GridBagConstraints();
gbc.gridx= 1;
gbc.gridy= 2;
gbc.weightx= 1.0;
gbc.weighty= 1.0;
gbc.anchor= GridBagConstraints.CENTER;
gbc.fill= GridBagConstraints.BOTH;
gbc.insets= new Insets( 10, 5, 0, 0);
((GridBagLayout)p.getLayout()).setConstraints( mediaPanel, gbc);
p.add( mediaPanel);
JPanel buttonPanel= new JPanel();
rtcp= new JButton( "RTCP Monitor");
update= new JButton( "Transmission Status");
update.setEnabled( false);
rtcp.addActionListener( this);
update.addActionListener( this);
buttonPanel.add( rtcp);
buttonPanel.add( update);
gbc= new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth= 2;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets( 5,5,10,5);
((GridBagLayout)p.getLayout()).setConstraints( buttonPanel, gbc);
p.add( buttonPanel);
getContentPane().add( p);
list.addMouseListener( this);
addWindowListener( this);
pack();
setVisible( true);
private JPanel createMediaPanel() {
JPanel p= new JPanel();
GridBagLayout gridBagLayout= new GridBagLayout();
GridBagConstraints gbc;
p.setLayout( gridBagLayout);
JLabel label= new JLabel( "Media Locator:");
gbc= new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,10,5);
((GridBagLayout)p.getLayout()).setConstraints( label, gbc);
p.add( label);
tf_media_file= new JTextField( 35);
gbc= new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets( 5,5,10,5);
((GridBagLayout)p.getLayout()).setConstraints( tf_media_file, gbc);
p.add( tf_media_file);
tf_media_file.setText( config.media_locator);
cb_loop= new JCheckBox( "loop");
startXmit= new JButton( "Start Transmission");
startXmit.setEnabled( true);
startXmit.addActionListener( this);
gbc= new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,10,5);
((GridBagLayout)p.getLayout()).setConstraints( cb_loop, gbc);
p.add( cb_loop);
cb_loop.setSelected( true);
cb_loop.addActionListener( this);
gbc= new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 1;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,10,5);
((GridBagLayout)p.getLayout()).setConstraints( startXmit, gbc);
p.add( startXmit);
TitledBorder titledBorder= new TitledBorder( new EtchedBorder(), "Source");
p.setBorder( titledBorder);
return p;
private JPanel createTargetPanel() {
JPanel p= new JPanel();
GridBagLayout gridBagLayout= new GridBagLayout();
GridBagConstraints gbc;
p.setLayout( gridBagLayout);
targets= new Vector();
for( int i= 0; i < config.targets.size(); i++) {
targets.addElement( config.targets.elementAt( i));
listModel= new TargetListModel( targets);
list= new JList( listModel);
list.addKeyListener( this);
list.setPrototypeCellValue( "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
JScrollPane scrollPane= new JScrollPane( list,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
gbc= new GridBagConstraints();
gbc.gridx= 0;
gbc.gridy= 0;
gbc.weightx= 1.0;
gbc.weighty= 1.0;
gbc.anchor= GridBagConstraints.CENTER;
gbc.fill= GridBagConstraints.BOTH;
gbc.insets= new Insets( 10, 5, 0, 0);
((GridBagLayout)p.getLayout()).setConstraints( scrollPane, gbc);
p.add( scrollPane);
JPanel p1= new JPanel();
p1.setLayout( gridBagLayout);
JLabel label= new JLabel( "IP Address:");
gbc= new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,0,5);
((GridBagLayout)p1.getLayout()).setConstraints( label, gbc);
p1.add( label);
tf_remote_address= new JTextField( 15);
gbc= new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,0,5);
((GridBagLayout)p1.getLayout()).setConstraints( tf_remote_address, gbc);
p1.add( tf_remote_address);
label= new JLabel( "Data Port:");
gbc= new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,0,5);
((GridBagLayout)p1.getLayout()).setConstraints( label, gbc);
p1.add( label);
tf_remote_data_port= new JTextField( 15);
gbc= new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 1;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,0,5);
((GridBagLayout)p1.getLayout()).setConstraints( tf_remote_data_port, gbc);
p1.add( tf_remote_data_port);
JPanel p2= new JPanel();
addTarget= new JButton( "Add Target");
removeTarget= new JButton( "Remove Target");
p2.add( addTarget);
p2.add( removeTarget);
addTarget.addActionListener( this);
removeTarget.addActionListener( this);
gbc= new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.gridwidth= 2;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets( 20,5,0,5);
((GridBagLayout)p1.getLayout()).setConstraints( p2, gbc);
p1.add( p2);
gbc= new GridBagConstraints();
gbc.gridx= 1;
gbc.gridy= 0;
gbc.weightx= 1.0;
gbc.weighty= 1.0;
gbc.anchor= GridBagConstraints.CENTER;
gbc.fill= GridBagConstraints.BOTH;
gbc.insets= new Insets( 10, 5, 0, 0);
((GridBagLayout)p.getLayout()).setConstraints( p1, gbc);
p.add( p1);
TitledBorder titledBorder= new TitledBorder( new EtchedBorder(), "Targets");
p.setBorder( titledBorder);
return p;
private JPanel createLocalPanel() {
JPanel p= new JPanel();
GridBagLayout gridBagLayout= new GridBagLayout();
GridBagConstraints gbc;
p.setLayout( gridBagLayout);
JLabel label= new JLabel( "IP Address:");
gbc= new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,0,5);
((GridBagLayout)p.getLayout()).setConstraints( label, gbc);
p.add( label);
JTextField tf_local_host= new JTextField( 15);
gbc= new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,0,5);
((GridBagLayout)p.getLayout()).setConstraints( tf_local_host, gbc);
p.add( tf_local_host);
try {
String host= InetAddress.getLocalHost().getHostAddress();
tf_local_host.setText( host);
} catch( UnknownHostException e) {
label= new JLabel( "Data Port:");
gbc= new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,0,5);
((GridBagLayout)p.getLayout()).setConstraints( label, gbc);
p.add( label);
tf_data_port= new JTextField( 15);
gbc= new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 1;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets( 5,5,10,5);
((GridBagLayout)p.getLayout()).setConstraints( tf_data_port, gbc);
p.add( tf_data_port);
tf_data_port.setText( config.local_data_port);
TitledBorder titledBorder= new TitledBorder( new EtchedBorder(), "Local Host");
p.setBorder( titledBorder);
return p;
public void actionPerformed( ActionEvent event) {
Object source= event.getSource();
if( source == addTarget) {
String ip= tf_remote_address.getText().trim();
String port= tf_remote_data_port.getText().trim();
String localPort= tf_data_port.getText().trim();
addTargetToList( localPort, ip, port);
if( avTransmitter != null) {
avTransmitter.addTarget( ip, port);
} else if( source == removeTarget) {
int index= list.getSelectedIndex();
if( index != -1) {
Target target= (Target) targets.elementAt( index);
if( avTransmitter != null) {
avTransmitter.removeTarget( target.ip, target.port);
targets.removeElement( target);
listModel.setData( targets);
} else if( source == startXmit) {
if( startXmit.getLabel().equals( "Start Transmission")) {
int data_port= new Integer( tf_data_port.getText()).intValue();
avTransmitter= new AVTransmitter( this, data_port);
avTransmitter.start( tf_media_file.getText().trim(), targets);
avTransmitter.setLooping( cb_loop.isSelected());
startXmit.setLabel( "Stop Transmission");
} else if( startXmit.getLabel().equals( "Stop Transmission")) {
avTransmitter.stop();
avTransmitter= null;
removeNonBaseTargets();
listModel.setData( targets);
startXmit.setLabel( "Start Transmission");
} else if( source == rtcp) {
if( rtcpViewer == null) {
rtcpViewer= new RTCPViewer();
} else {
rtcpViewer.setVisible( true);
rtcpViewer.toFront();
} else if( source == cb_loop) {
if( avTransmitter != null) {
avTransmitter.setLooping( cb_loop.isSelected());
private void removeNonBaseTargets() {
String localPort= tf_data_port.getText().trim();
for( int i= targets.size(); i > 0;) {
Target target= (Target) targets.elementAt( i - 1);
if( !target.localPort.equals( localPort)) {
targets.removeElement( target);
i--;
public void addTargetToList( String localPort,
String ip, String port) {
ListUpdater listUpdater= new ListUpdater( localPort, ip,
port, listModel, targets);
SwingUtilities.invokeLater( listUpdater);
public void rtcpReport( String report) {
if( rtcpViewer != null) {
rtcpViewer.report( report);
public void windowClosing( WindowEvent event) {
config.local_data_port= tf_data_port.getText().trim();
config.targets= new Vector();
for( int i= 0; i < targets.size(); i++) {
Target target= (Target) targets.elementAt( i);
if( target.localPort.equals( config.local_data_port)) {
config.addTarget( target.ip, target.port);
config.media_locator= tf_media_file.getText().trim();
config.write();
System.exit( 0);
public void windowClosed( WindowEvent event) {
public void windowDeiconified( WindowEvent event) {
public void windowIconified( WindowEvent event) {
public void windowActivated( WindowEvent event) {
public void windowDeactivated( WindowEvent event) {
public void windowOpened( WindowEvent event) {
public void keyPressed( KeyEvent event) {
public void keyReleased( KeyEvent event) {
Object source= event.getSource();
if( source == list) {
int index= list.getSelectedIndex();
public void keyTyped( KeyEvent event) {
public void mousePressed( MouseEvent e) {
public void mouseReleased( MouseEvent e) {
public void mouseEntered( MouseEvent e) {
public void mouseExited( MouseEvent e) {
public void mouseClicked( MouseEvent e) {
Object source= e.getSource();
if( source == list) {
int index= list.getSelectedIndex();
if( index != -1) {
Target target= (Target) targets.elementAt( index);
tf_remote_address.setText( target.ip);
tf_remote_data_port.setText( target.port);
int index= list.locationToIndex( e.getPoint());
public static void main( String[] args) {
new Tx();
class TargetListModel extends AbstractListModel {
private Vector options;
public TargetListModel( Vector options) {
this.options= options;
public int getSize() {
int size;
if( options == null) {
size= 0;
} else {
size= options.size();
return size;
public Object getElementAt( int index) {
String name;
if( index < getSize()) {
Target o= (Target)options.elementAt( index);
name= o.localPort + " ---> " + o.ip + ":" + o.port;
} else {
name= null;
return name;
public void setData( Vector data) {
options= data;
fireContentsChanged( this, 0, data.size());
class ListUpdater implements Runnable {
String localPort, ip, port;
TargetListModel listModel;
Vector targets;
public ListUpdater( String localPort, String ip, String port,
TargetListModel listModel, Vector targets) {
this.localPort= localPort;
this.ip= ip;
this.port= port;
this.listModel= listModel;
this.targets= targets;
public void run() {
Target target= new Target( localPort, ip, port);
if( !targetExists( localPort, ip, port)) {
targets.addElement( target);
listModel.setData( targets);
public boolean targetExists( String localPort, String ip, String port) {
boolean exists= false;
for( int i= 0; i < targets.size(); i++) {
Target target= (Target) targets.elementAt( i);
if( target.localPort.equals( localPort)
&& target.ip.equals( ip)
&& target.port.equals( port)) {
exists= true;
break;
return exists;
import java.awt.*;
import java.io.*;
import java.net.InetAddress;
import java.util.*;
import javax.media.*;
import javax.media.protocol.*;
import javax.media.format.*;
import javax.media.control.TrackControl;
import javax.media.control.QualityControl;
import javax.media.rtp.*;
import javax.media.rtp.event.*;
import javax.media.rtp.rtcp.*;
public class AVTransmitter implements ReceiveStreamListener, RemoteListener,
ControllerListener {
// Input MediaLocator
// Can be a file or http or capture source
private MediaLocator locator;
private String ipAddress;
private int portBase;
private Processor processor = null;
private RTPManager rtpMgrs[];
private int localPorts[];
private DataSource dataOutput = null;
private int local_data_port;
private Tx tx;
public AVTransmitter( Tx tx, int data_port) {
this.tx= tx;
local_data_port= data_port;
* Starts the transmission. Returns null if transmission started ok.
* Otherwise it returns a string with the reason why the setup failed.
public synchronized String start( String filename, Vector targets) {
String result;
locator= new MediaLocator( filename);
// Create a processor for the specified media locator
// and program it to output JPEG/RTP
result = createProcessor();
if (result != null) {
return result;
// Create an RTP session to transmit the output of the
// processor to the specified IP address and port no.
result = createTransmitter( targets);
if (result != null) {
processor.close();
processor = null;
return result;
// Start the transmission
processor.start();
return null;
* Use the RTPManager API to create sessions for each media
* track of the processor.
private String createTransmitter( Vector targets) {
// Cheated. Should have checked the type.
PushBufferDataSource pbds = (PushBufferDataSource)dataOutput;
PushBufferStream pbss[] = pbds.getStreams();
rtpMgrs = new RTPManager[pbss.length];
localPorts = new int[ pbss.length];
SessionAddress localAddr, destAddr;
InetAddress ipAddr;
SendStream sendStream;
int port;
SourceDescription srcDesList[];
for (int i = 0; i < pbss.length; i++) {
// for (int i = 0; i < 1; i++) {
try {
rtpMgrs[i] = RTPManager.newInstance();
port = local_data_port + 2*i;
localPorts[ i]= port;
localAddr = new SessionAddress( InetAddress.getLocalHost(),
port);
rtpMgrs.initialize( localAddr);
rtpMgrs[i].addReceiveStreamListener(this);
rtpMgrs[i].addRemoteListener(this);
for( int k= 0; k < targets.size(); k++) {
Target target= (Target) targets.elementAt( k);
int targetPort= new Integer( target.port).intValue();
addTarget( localPorts[ i], rtpMgrs[ i], target.ip, targetPort + 2*i);
sendStream = rtpMgrs[i].createSendStream(dataOutput, i);
sendStream.start();
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
return null;
public void addTarget( String ip, String port) {
for (int i= 0; i < rtpMgrs.length; i++) {
int targetPort= new Integer( port).intValue();
addTarget( localPorts[ i], rtpMgrs[ i], ip, targetPort + 2*i);
public void addTarget( int localPort, RTPManager mgr, String ip, int port) {
try {
SessionAddress addr= new SessionAddress( InetAddress.getByName( ip),
new Integer( port).intValue());
mgr.addTarget( addr);
tx.addTargetToList( localPort + "", ip, port + "");
} catch( Exception e) {
e.printStackTrace();
public void removeTarget( String ip, String port) {
try {
SessionAddress addr= new SessionAddress( InetAddress.getByName( ip),
new Integer( port).intValue());
for (int i= 0; i < rtpMgrs.length; i++) {
rtpMgrs[ i].removeTarget( addr, "target removed from transmitter.");
} catch( Exception e) {
e.printStackTrace();
boolean looping= true;
public void controllerUpdate( ControllerEvent ce) {
System.out.println( ce);
if( ce instanceof DurationUpdateEvent) {
Time duration= ((DurationUpdateEvent) ce).getDuration();
System.out.println( "duration: " + duration.getSeconds());
} else if( ce instanceof EndOfMediaEvent) {
System.out.println( "END OF MEDIA - looping=" + looping);
if( looping) {
processor.setMediaTime( new Time( 0));
processor.start();
public void setLooping( boolean flag) {
looping= flag;
public void update( ReceiveStreamEvent event) {
String timestamp= getTimestamp();
StringBuffer sb= new StringBuffer();
if( event instanceof InactiveReceiveStreamEvent) {
sb.append( timestamp + " Inactive Receive Stream");
} else if( event instanceof ByeEvent) {
sb.append( timestamp + " Bye");
} else {
System.out.println( "ReceiveStreamEvent: "+ event);
tx.rtcpReport( sb.toString());
public void update( RemoteEvent event) {
String timestamp= getTimestamp();
if( event instanceof ReceiverReportEvent) {
ReceiverReport rr= ((ReceiverReportEvent) event).getReport();
StringBuffer sb= new StringBuffer();
sb.append( timestamp + " RR");
if( rr != null) {
Participant participant= rr.getParticipant();
if( participant != null) {
sb.append( " from " + participant.getCNAME());
sb.append( " ssrc=" + rr.getSSRC());
} else {
sb.append( " ssrc=" + rr.getSSRC());
tx.rtcpReport( sb.toString());
} else {
System.out.println( "RemoteEvent: " + event);
private String getTimestamp() {
String timestamp;
Calendar calendar= Calendar.getInstance();
int hour= calendar.get( Calendar.HOUR_OF_DAY);
String hourStr= formatTime( hour);
int minute= calendar.get( Calendar.MINUTE);
String minuteStr= formatTime( minute);
int second= calendar.get( Calendar.SECOND);
String secondStr= formatTime( second);
timestamp= hourStr + ":" + minuteStr + ":" + secondStr;
return timestamp;
private String formatTime( int time) {
String timeStr;
if( time < 10) {
timeStr= "0" + time;
} else {
timeStr= "" + time;
return timeStr;
* Stops the transmission if already started
public void stop() {
synchronized (this) {
if (processor != null) {
processor.stop();
processor.close();
processor = null;
for (int i= 0; i < rtpMgrs.length; i++) {
rtpMgrs[ i].removeTargets( "Session ended.");
rtpMgrs[ i].dispose();
public String createProcessor() {
if (locator == null) {
return "Locator is null";
DataSource ds;
DataSource clone;
try {
ds = javax.media.Manager.createDataSource(locator);
} catch (Exception e) {
return "Couldn't create DataSource";
// Try to create a processor to handle the input media locator
try {
processor = javax.media.Manager.createProcessor(ds);
processor.addControllerListener( this);
} catch (NoProcessorException npe) {
return "Couldn't create processor";
} catch (IOException ioe) {
return "IOException creating processor";
// Wait for it to configure
boolean result = waitForState(processor, Processor.Configured);
if (result == false)
return "Couldn't configure processor";
// Get the tracks from the processor
TrackControl [] tracks = processor.getTrackControls();
// Do we have atleast one track?
if (tracks == null || tracks.length < 1)
return "Couldn't find tracks in processor";
// Set the output content descriptor to RAW_RTP
// This will limit the supported formats reported from
// Track.getSupportedFormats to only valid RTP formats.
ContentDescriptor cd = new ContentDescriptor(ContentDescriptor.RAW_RTP);
processor.setContentDescriptor(cd);
Format supported[];
Format chosen;
boolean atLeastOneTrack = false;
// Program the tracks.
for (int i = 0; i < tracks.length; i++) {
Format format = tracks[i].getFormat();
if (tracks[i].isEnabled()) {
supported = tracks[i].getSupportedFormats();
// We've set the output content to the RAW_RTP.
// So all the supported formats should work with RTP.
// We'll just pick the first one.
if (supported.length > 0) {
if (supported[0] instanceof VideoFormat) {
// For video formats, we should double check the
// sizes since not all formats work in all sizes.
chosen = checkForVideoSizes(tracks[i].getFormat(),
supported[0]);
} else
chosen = supported[0];
tracks[i].setFormat(chosen);
System.err.println("Track " + i + " is set to transmit as:");
System.err.println(" " + chosen);
atLeastOneTrack = true;
} else
tracks[i].setEnabled(false);
} else
tracks[i].setEnabled(false);
if (!atLeastOneTrack)
return "Couldn't set any of the tracks to a valid RTP format";
// Realize the processor. This will internally create a flow
// graph and attempt to create an output datasource for JPEG/RTP
// audio frames.
result = waitForState(processor, Controller.Realized);
if (result == false)
return "Couldn't realize processor";
// Set the JPEG quality to .5.
setJPEGQuality(processor, 0.5f);
// Get the output data source of the processor
dataOutput = processor.getDataOutput();
return null;
static SessionAddress destAddr1, destAddr2;
* For JPEG and H263, we know that they only work for particular
* sizes. So we'll perform extra checking here to make sure they
* are of the right sizes.
Format checkForVideoSizes(Format original, Format supported) {
int width, height;
Dimension size = ((VideoFormat)original).getSize();
Format jpegFmt = new Format(VideoFormat.JPEG_RTP);
Format h263Fmt = new Format(VideoFormat.H263_RTP);
if (supported.matches(jpegFmt)) {
// For JPEG, make sure width and height are divisible by 8.
width = (size.width % 8 == 0 ? size.width :
(int)(size.width / 8) * 8);
height = (size.height % 8 == 0 ? size.height :
(int)(size.height / 8) * 8);
} else if (supported.matches(h263Fmt)) {
// For H.263, we only support some specific sizes.
if (size.width < 128) {
width = 128;
height = 96;
} else if (size.width < 176) {
width = 176;
height = 144;
} else {
width = 352;
height = 288;
} else {
// We don't know this particular format. We'll just
// leave it alone then.
return supported;
return (new VideoFormat(null,
new Dimension(width, height),
Format.NOT_SPECIFIED,
null,
Format.NOT_SPECIFIED)).intersects(supported);
* Setting the encoding quality to the specified value on the JPEG encoder.
* 0.5 is a good default.
void setJPEGQuality(Player p, float val) {
Control cs[] = p.getControls();
QualityControl qc = null;
VideoFormat jpegFmt = new VideoFormat(VideoFormat.JPEG);
// Loop through the controls to find the Quality control for
// the JPEG encoder.
for (int i = 0; i < cs.length; i++) {
if (cs[i] instanceof QualityControl &&
cs[i] instanceof Owned) {
Object owner = ((Owned)cs[i]).getOwner();
// Check to see if the owner is a Codec.
// Then check for the output format.
if (owner instanceof Codec) {
Format fmts[] = ((Codec)owner).getSupportedOutputFormats(null);
for (int j = 0; j < fmts.length; j++) {
if (fmts[j].matches(jpegFmt)) {
qc = (QualityControl)cs[i];
qc.setQuality(val);
System.err.println("- Setting quality to " +
val + " on " + qc);
break;
if (qc != null)
break;
* Convenience methods to handle processor's state changes.
private Integer stateLock = new Integer(0);
private boolean failed = false;
Integer getStateLock() {
return stateLock;
void setFailed() {
failed = true;
private synchronized boolean waitForState(Processor p, int state) {
p.addControllerListener(new StateListener());
failed = false;
// Call the required method on the processor
if (state == Processor.Configured) {
p.configure();
} else if (state == Processor.Realized) {
p.realize();
// Wait until we get an event that confirms the
// success of the method, or a failure event.
// See StateListener inner class
while (p.getState() < state && !failed) {
synchronized (getStateLock()) {
try {
getStateLock().wait();
} catch (InterruptedException ie) {
return false;
if (failed)
return false;
else
return true;
* Inner Classes
class StateListener implements ControllerListener {
public void controllerUpdate(ControllerEvent ce) {
// If there was an error during configure or
// realize, the processor will be closed
if (ce instanceof ControllerClosedEvent)
setFailed();
// All controller events, send a notification
// to the waiting thread in waitForState method.
if (ce instanceof ControllerEvent) {
synchronized (getStateLock()) {
getStateLock().notifyAll();
import java.io.*;
import java.util.*;
public class Config {
private String pathPrefix;
public String local_data_port;
public Vector targets;
public String media_locator;
public Config() {
pathPrefix= System.getProperty( "user.home") + File.separator;
read();
public void read() {
targets= new Vector();
try {
String path= pathPrefix + "xmit.dat";
FileInputStream fin= new FileInputStream( path);
BufferedInputStream bin= new BufferedInputStream( fin);
DataInputStream din= new DataInputStream( bin);
local_data_port= readString( din);
int n_targets= din.readInt();
for( int i= 0; i < n_targets; i++) {
String ip= readString( din);
String port= readString( din);
targets.addElement( new Target( local_data_port, ip, port));
media_locator= readString( din);
fin.close();
} catch( IOException e) {
System.out.println( "xmit.dat file missing!");
local_data_port= "";
media_locator= "";
public void write() {
try {
String path= pathPrefix + "xmit.dat";
FileOutputStream fout= new FileOutputStream( path);
BufferedOutputStream bout= new BufferedOutputStream( fout);
DataOutputStream dout= new DataOutputStream( bout);
writeString( dout, local_data_port);
dout.writeInt( targets.size());
for( int i= 0; i < targets.size(); i++) {
Target target= (Target) targets.elementAt( i);
writeString( dout, target.ip);
writeString( dout, target.port);
writeString( dout, media_locator);
dout.flush();
dout.close();
fout.close();
} catch( IOException e) {
System.out.println( "Error writing xmit.dat!");
public String readString( DataInputStream din) {
String s= null;
try {
short length= din.readShort();
if( length > 0) {
byte buf[]= new byte[ length];
din.read( buf, 0, length);
s= new String( buf);
} catch( IOException e) {
System.err.println( e);
return s;
public void writeString( DataOutputStream dout, String str) {
try {
if( str != null) {
dout.writeShort( str.length());
dout.writeBytes( str);
} else {
dout.writeShort( 0);
} catch( Exception e) {
e.printStackTrace();
public void addTarget( String ip, String port) {
targets.addElement( new Target( "", ip, port));
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.media.rtp.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
public class RTCPViewer extends JFrame implements ActionListener, KeyListener,
MouseListener, WindowListener {
private JList list;
private Vector reports;
private RtcpListModel listModel;
private JButton clear;
private JButton start;
private boolean recording;
public RTCPViewer() {
setTitle( "JMF/RTCP Tracer");
reI'm also getting some really bad sound quality on facebook notifications. I've been forced to disable them they sound horrible like they are clipping.
Trying to figure out if this is a problem on all Late 2013 15" macbook pros or if mine is defective? This occurs even at around 20-30% volume levels with the Facebook notification sound problems... -
How we can use class and methods for the FM of reuse_alv_list_display
Hi Abapers,
Please provide the sample code of class and method of REUSE_ALV_LIST_DISPLAY.
Which Class i can use for this Function module.
I need to write a code using OOPS concept.
I was done the GRID display using this class cl_gui_alv_grid.
But i want only List Display using the class & methods.
Plz provide sample code.
Thanks
Nani.Hi Nani,
This is the sample code..
*& Report Z_OO_ALV
*& We can Use Two containers in OOALV
REPORT z_oo_alv LINE-COUNT 50.
*types gt_struct type sflight.
DATA BEGIN OF gt_struct.
INCLUDE STRUCTURE sflight.
DATA rcol(4) TYPE c.
DATA colors TYPE lvc_t_scol.
DATA END OF gt_struct.
*ALV GRIDs
DATA gr_alvgrid TYPE REF TO cl_gui_alv_grid.
DATA gr_alvgrid1 TYPE REF TO cl_gui_alv_grid.
DATA gc_custom_control_name TYPE scrfname VALUE 'CC_ALV'.
DATA gc_custom_control_name1 TYPE scrfname VALUE 'CC_ALV1'.
*CONTAINERs
DATA gr_ccontainer TYPE REF TO cl_gui_custom_container.
DATA gr_ccontainer1 TYPE REF TO cl_gui_custom_container.
*FIELDCATALOGs
DATA gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA gt_fieldcat1 TYPE lvc_t_fcat WITH HEADER LINE.
*LAYOUTs
DATA gs_layout TYPE lvc_s_layo.
DATA gs_layout1 TYPE lvc_s_layo.
DATA pt_exclude TYPE ui_functions. "internal table declaration to be passed.
*DATA pt_cell TYPE lvc_t_cell with header line.
DATA : gt_list LIKE gt_struct OCCURS 50 WITH HEADER LINE,
gt_list1 LIKE gt_struct OCCURS 50 WITH HEADER LINE.
*DATA v_ucomm TYPE sy-ucomm.
CALL SCREEN 100.
*& Module display_alv OUTPUT
text
MODULE display_alv OUTPUT.
PERFORM display_alv.
ENDMODULE. " display_alv OUTPUT
*& Module PAI INPUT
text
MODULE pai INPUT.
CASE sy-ucomm.
WHEN 'EXIT'.
PERFORM exit_program.
WHEN 'PICK'.
PERFORM cell_info.
ENDCASE.
ENDMODULE. " PAI INPUT
*& Form display_alv
text
FORM display_alv.
PERFORM prepare_field_catalog CHANGING gt_fieldcat[].
PERFORM prepare_layout CHANGING gs_layout.
PERFORM data_retrival.
IF gr_alvgrid IS INITIAL.
CREATE OBJECT gr_ccontainer
EXPORTING
container_name = gc_custom_control_name
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
ENDIF.
CREATE OBJECT gr_alvgrid
EXPORTING
I_SHELLSTYLE = 0
I_LIFETIME =
i_parent = gr_ccontainer
I_APPL_EVENTS = space
I_PARENTDBG =
I_APPLOGPARENT =
I_GRAPHICSPARENT =
I_NAME =
I_FCAT_COMPLETE = SPACE
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
PERFORM exclude_tb_functions CHANGING pt_exclude.
PERFORM set_col.
CALL METHOD gr_alvgrid->set_table_for_first_display
EXPORTING
I_BUFFER_ACTIVE =
I_BYPASSING_BUFFER =
I_CONSISTENCY_CHECK =
I_STRUCTURE_NAME =
IS_VARIANT =
I_SAVE =
I_DEFAULT = 'X'
is_layout = gs_layout
IS_PRINT =
IT_SPECIAL_GROUPS =
it_toolbar_excluding = pt_exclude "excluding toolbar functions
IT_HYPERLINK =
IT_ALV_GRAPHICS =
IT_EXCEPT_QINFO =
IR_SALV_ADAPTER =
CHANGING
it_outtab = gt_list[]
it_fieldcatalog = gt_fieldcat[]
IT_SORT =
IT_FILTER =
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ELSE.
CALL METHOD gr_alvgrid->refresh_table_display
EXPORTING
IS_STABLE =
I_SOFT_REFRESH =
EXCEPTIONS
finished = 1
OTHERS = 2
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
PERFORM prepare_field_catalog1 CHANGING gt_fieldcat1[].
PERFORM prepare_layout1 CHANGING gs_layout1.
PERFORM data_retrival1.
IF gr_alvgrid1 IS INITIAL.
CREATE OBJECT gr_ccontainer1
EXPORTING
container_name = gc_custom_control_name1
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
ENDIF.
CREATE OBJECT gr_alvgrid1
EXPORTING
I_SHELLSTYLE = 0
I_LIFETIME =
i_parent = gr_ccontainer1
I_APPL_EVENTS = space
I_PARENTDBG =
I_APPLOGPARENT =
I_GRAPHICSPARENT =
I_NAME =
I_FCAT_COMPLETE = SPACE
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
PERFORM set_col1.
CALL METHOD gr_alvgrid1->set_table_for_first_display
EXPORTING
I_BUFFER_ACTIVE =
I_BYPASSING_BUFFER =
I_CONSISTENCY_CHECK =
I_STRUCTURE_NAME =
IS_VARIANT =
I_SAVE =
I_DEFAULT = 'X'
is_layout = gs_layout1
IS_PRINT =
IT_SPECIAL_GROUPS =
IT_TOOLBAR_EXCLUDING =
IT_HYPERLINK =
IT_ALV_GRAPHICS =
IT_EXCEPT_QINFO =
IR_SALV_ADAPTER =
CHANGING
it_outtab = gt_list1[]
it_fieldcatalog = gt_fieldcat1[]
IT_SORT =
IT_FILTER =
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ELSE.
CALL METHOD gr_alvgrid1->refresh_table_display
EXPORTING
IS_STABLE =
I_SOFT_REFRESH =
EXCEPTIONS
finished = 1
OTHERS = 2
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDFORM. "display_alv
*& Form prepare_field_catalog
text
-->GT_FIELDCAT text
FORM prepare_field_catalog CHANGING pgt_fieldcat TYPE lvc_t_fcat.
DATA ls_fieldcat TYPE lvc_s_fcat.
ls_fieldcat-tabname = 'gt_list'.
ls_fieldcat-fieldname = 'CARRID'.
ls_fieldcat-scrtext_m = 'Air line code'.
ls_fieldcat-col_pos = 0.
ls_fieldcat-outputlen = 10.
ls_fieldcat-emphasize = 'C400'.
ls_fieldcat-key = 'X'.
APPEND ls_fieldcat TO pgt_fieldcat.
ls_fieldcat-tabname = 'gt_list'.
ls_fieldcat-col_pos = 1.
ls_fieldcat-fieldname = 'CONNID'.
ls_fieldcat-scrtext_m = 'Connection code'.
ls_fieldcat-emphasize = 'C900'.
APPEND ls_fieldcat TO pgt_fieldcat.
ls_fieldcat-tabname = 'gt_list'.
ls_fieldcat-fieldname = 'PRICE'.
ls_fieldcat-scrtext_m = 'PRICE'.
APPEND ls_fieldcat TO pgt_fieldcat.
ENDFORM. "prepare_field_catalog
*& Form prepare_layout
text
-->GS_LAYOUT text
FORM prepare_layout CHANGING gs_layout TYPE lvc_s_layo.
gs_layout-stylefname = 'FIELD_STYLE'.
gs_layout-zebra = 'X'.
gs_layout-grid_title = 'FLIGHT'.
gs_layout-sel_mode = 'A'.
gs_layout-ctab_fname = 'COLORS'.
ENDFORM. "prepare_layout
*& Form data_retrival
text
FORM data_retrival.
SELECT carrid
connid
price
FROM sflight
INTO CORRESPONDING FIELDS OF TABLE gt_list
UP TO 50 ROWS.
ENDFORM. "data_retrival
FORM EXIT_PROGRAM *
FORM exit_program.
CALL METHOD gr_ccontainer->free.
CALL METHOD gr_ccontainer1->free.
LEAVE TO SCREEN 0.
ENDFORM. "exit_program
*& Module STATUS_0100 OUTPUT
text
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STAT'.
SET TITLEBAR 'xxx'.
IF W_CUSTOM_CONTAINER IS INITIAL.
**sets TITLEBAR
PERFORM TITLEBAR.
ENDMODULE. " STATUS_0100 OUTPUT
*& Form prepare_field_catalog1
text
-->GT_FIELDCAT text
FORM prepare_field_catalog1 CHANGING pgt_fieldcat1 TYPE lvc_t_fcat.
DATA ls_fieldcat TYPE lvc_s_fcat.
ls_fieldcat-tabname = 'gt_list1'.
ls_fieldcat-fieldname = 'SEATSMAX'.
ls_fieldcat-scrtext_m = 'MAX. SEATS'.
ls_fieldcat-col_pos = 0.
ls_fieldcat-outputlen = 10.
ls_fieldcat-emphasize = 'C400'.
ls_fieldcat-key = ' '.
APPEND ls_fieldcat TO pgt_fieldcat1.
ls_fieldcat-tabname = 'gt_list1'.
ls_fieldcat-col_pos = 1.
ls_fieldcat-fieldname = 'SEATSOCC'.
ls_fieldcat-scrtext_m = 'SEATS OCCUPIED'.
APPEND ls_fieldcat TO pgt_fieldcat1.
ENDFORM. "prepare_field_catalog
*& Form prepare_layout1
text
-->GS_LAYOUT text
FORM prepare_layout1 CHANGING gs_layout1 TYPE lvc_s_layo.
gs_layout1-stylefname = 'FIELD_STYLE'.
gs_layout1-zebra = 'X'.
gs_layout1-grid_title = 'DETAILS'.
gs_layout-sel_mode = 'C'.
gs_layout1-info_fname = 'RCOL'.
gs_layout-no_toolbar = 'X'.
ENDFORM. "prepare_layout
*& Form data_retrival1
text
FORM data_retrival1.
SELECT seatsmax
seatsocc
FROM sflight
INTO CORRESPONDING FIELDS OF TABLE gt_list1
UP TO 50 ROWS.
ENDFORM. "data_retrival
*& Form exclude_tb_functions
&---- subroutine to exclude toolbar options -
text
-->PT_EXCLUDE text
FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions.
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_maximum.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_minimum.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_subtot.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_sort.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_sum.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_subtot.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_sum.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_filter.
APPEND ls_exclude TO pt_exclude.
ENDFORM. "data_retrival1
*& Form cell_info
text
FORM cell_info. "CHANGING pt_cell TYPE lvc_t_cell.
DATA lt_cell TYPE lvc_t_cell WITH HEADER LINE.
CALL METHOD gr_alvgrid->get_selected_cells
IMPORTING
et_cell = lt_cell[].
LOOP AT lt_cell.
WRITE : lt_cell-col_id , lt_cell-row_id.
ENDLOOP.
MODIFY pt_cell[] from lt_cell[].
ENDFORM. "cell_info
*& Form set_col
text
FORM set_col .
DATA ls_cellcolor TYPE lvc_s_scol.
LOOP AT gt_list.
IF gt_list-price GT 500.
ls_cellcolor-fname = 'PRICE'.
ls_cellcolor-color-col = 5.
ls_cellcolor-color-int = 1.
ls_cellcolor-color-inv = 0.
APPEND ls_cellcolor TO gt_list-colors.
else.
ls_cellcolor-fname = 'PRICE'.
ls_cellcolor-color-col = 3.
ls_cellcolor-color-int = 1.
APPEND ls_cellcolor TO gt_list-colors.
ENDIF.
MODIFY gt_list.
ENDLOOP.
ENDFORM. "set_col
*& Form set_col1
text
FORM set_col1.
data : ind type sy-tabix,
indx type sy-tabix.
loop at gt_list1.
ind = sy-tabix / 2.
indx = sy-tabix - ind.
if indx eq ind.
gt_list1-rcol = 'C500'.
endif.
MODIFY gt_list1.
endloop.
ENDFORM. "set_col
*FORM TITLEBAR.
*SET TITLEBAR 'TITLE'.
*ENDFORM.
*double click on TITLE and write ur title
Thanks,
Samantak.
Rewards points for useful answers. -
Deployed EJB.jar has some classes with zero bytes
Has anyone hit a situation where Windows Jdev 902 puts class files into the ....EJB.jar file with zero bytes? In my case, the eight zero length classes are: seven My...Row.class files and the MyApplicationModule.class file. They all are in the /mypackage/common/ package and are in the ...classes/mypackage/common/ file folder.
I can use PKZIP to delete the zero length classes and add them back into the .jar and everything works as expected.
There are no error messages generated during the deployment that creates the .jar file that has the problem.This was posted on another thread by jdev team...
We have been following this issue in support TAR 2274825.996. I sent some technical detail to the support rep on July 10, but it looks like that information never got added to the TAR. Well, FWIW, here it is:
The user may be running out of open files. The
stdio library which underlies Win32 programs (like the JVM) has a
limit on the number of files that can be open concurrently. The
limit is around 2000-2100 open files (I tested this on NT, 2000, and
XP), and the limit is on a per-process basis. If the user is running
into this limit because JDev has too many open files, then the utility
methods we use to open JAR files or other streams could be receiving
a java.io.FileNotFoundException exception with the message "Too many
open files". To verify this: go to the Windows Task Manager, go to
View | Select Columns... and be sure the "Handle Count" checkbox is
checked. Does the jdev.exe process have a disproportionately higher
number of handles than other processes? If the Handle Count is above
2000 (approx), JDev might be running out of open files. (I say "might" because
the Handle Count is for many different kinds of Win32 kernel objects,
not just for file handles.) If the Handle Count is the problem, then
it would explain the transient, nondeterministic behavior that the
user is reporting. Because the Handle limit is per-process, it would
explain why the user is able to use PKZIP or WinZip to repair the JAR
file. Try closing editors before deploying and see if that helps.
If the user confirms that the Handle Count is excessive, then we may
have a Handle leak of some kind in the product that will need to be
fixed.
Also try running JDev using "jdev -hotspot" on the command line instead
of just "jdev" and see if the behavior changes.
Hope that helps. We are monitoring the TAR, but no one has been able to reproduce the problem you are reporting, even with the files attached to the TAR, and yours is the only report so far that we've received about this specific problem.
I have added several more entities and views into app module. As I added each one, the list of zero byte jar classes would change, but always about 7-8 bad ones. Now that I am no longer adding new entities/views, the problem has become stable and repeatable. The same classes ALWAYS show up with zero bytes.
I monitored jdevw.exe while doing the deploy, and the number of handles never went above 675. I ran with jdevw.exe -hotspot and the results were exactly the same.
thanks,
Roger -
HELP, date class and parsing input
I have reviewed many posts in these forums and have found that detail gets the best results so I apologize in advance if this is detailed. I am taking a Java class and am not doing so hot. The last time I programmed was in 1998 and that was Ada, I very soon moved to Networking. I guess those that can't program become networkers, I don't know, but I am frustrated here.
Any how I am trying to write a rather simple program, but it is the manipulation of the date I am having difficulty with. Here are the requirements:
Overall Requirements
Create a class named Date that stores date values and prints out the date in either a pure numeric format or a name and number format (see sample session for format details).
Date.java class file
? Date objects should store the date in two int instance variables ─ day and month, and it should include the String instance variable, error, initialized with null.
Implement a 1-parameter Date constructor that receives a dateStr string parameter and performs complete error checking on the given dateStr value. The Date constructor is the entity that?s responsible for date error checking. That way, if a Date object is instantiated and if there are no errors, then you?re guaranteed that the Date object holds a legitimate date value. If any kind of error occurs, change the value of the error instance variable to a non-null string value, using an appropriate concatenation of a string constant, input substring, and/or API exception message.
Constructors use the same exception handling rules as methods: In a try block, include the parsing of the month and day substrings and other error-checking logic that will not work if parsing fails.
? Take into account the actual number of days in each month, but assume that there are always 28 days in February.
? To extract day and month numbers from the given date string, use String?s indexOf method to find the location of the slash character, and String?s substring method to extract month and day substrings from the input string.
? Include a method for printing the date with a numeric format. Use the zero-pad flag in a printf method call to get exactly two digits for each month and day.
? Include a method for printing the date with an alphabetic format.
Include a getError method which returns the value of the error instance variable.
DateDriver.java class file : In your driver class, include a loop that repeatedly:
? Asks the user to enter a date or ?q? to quit. ? If the entry is not ?q?, instantiate a Date object.
? If the error variable is null: o Print the date using numeric format.o Print the date using alphabetic format. Otherwise, print the value of the error variable.
I want to figure this out on my own as much as possible but have until tomorrow night to do so..............I need to understand how I can use Strings indexOf to parse the dateStr so I can locate the /. I see I can use it to find the position of a specified character, but I am not sure of the syntax I need to use. But then once I find the / I need to use the String's substring method to extract month and day. I think I might be able to get that, if I can get the / figured out.
The below is what I have in my Class and my Driver so far:
*DateDriver.java (driver program)
* Christine Miller-Lane
*Overall Requirements
*Create a class named Date that stores date values and prints out the date in either a pure numeric
format or a name and number
*format (see sample session for format details).
*DateDriver.java class file
*In your driver class,
*????????? If the error variable is null:
* ◦ Otherwise, print the value of the error variable.
import java.util.*;
public class DateDriver
Date datevalue;
public static void main(String[] args)
Scanner stdIn = new Scanner(System.in);
while (!xStr.equalsIgnoreCase("q"))
try
System.out.println("Enter a date in the form mm/dd ("q" to quit): ";
value = stdIn.nextLine();
datevalue = new Date(value); //instaniate the date object
System.out.println //print date in numeric format
System.out.println //print date in alphabetic format
break;
catch
System.out.println("print value of error variable.");
stdIn.next(); // Invalid input is still in the buffer so flush it.
} //endloop
}//end main
} //end class?
* Date.java
* Christine Miller-Lane
*Overall Requirements
*Create a class named Date that stores date values and prints out the date in either a pure numeric format or a name
*and number format (see sample session for format details).
*Date.java class file
*????????? Date objects should store the date in two int instance variables ─ day and month, and it should include
*the String instance variable, error, initialized with null.
* ? Implement a 1-parameter Date constructor that receives a dateStr string parameter and performs complete
* error checking on the given dateStr value. The Date constructor is the entity that?s responsible for date error
* checking. That way, if a Date object is instantiated and if there are no errors, then you?re guaranteed that the
* Date object holds a legitimate date value. If any kind of error occurs, change the value of the error instance
* variable to a non-null string value, using an appropriate concatenation of a string constant, input substring,
* and/or API exception message.?
* ? Constructors use the same exception handling rules as methods: In a try block, include the parsing of the
* month and day substrings and other error-checking logic that will not work if parsing fails.
*????????? Take into account the actual number of days in each month, but assume that there are always 28 days in February.
*????????? To extract day and month numbers from the given date string, use String?s indexOf method to find the
*location of the slash character, and String?s substring method to extract month and day substrings from the input string.
import java.util.*;
public class Date
Scanner stdIn = new Scanner(System.in);
boolean valid = false
int day;
int month;
String error = null;
String dayStr;
String monthStr;
String dateStr;
public Date(String dateStr)
// Look for the slash and set appropriate error if one isn't found. use String?s indexOf method to find the
//location of the slash character and String?s substring method to extract month and day substrings from the input string.
// Convert month portion to integer. Catch exceptions and set appropriate error if there are any.
Integer.parseInt(dateStr);
// Validate month is in range and set appropriate error if it isn't.
// Convert day portion to integer. Catch exceptions and set appropriate error if there are any.
// Validate day is in range based on the month (different days per month) and set appropriate error if it isn't.
//public void printDate() //Include a method for printing the date with a numeric format. Use the zero-pad flag in a printf method
//call to get exactly two digits for each month and day.
//{ //Include a method for printing the date with an alphabetic format.
// } // end print report
// public getError()
//Include a getError method which returns the value of the error instance variable.
}//end class Date
Here is sample out put needed::::::::
Sample Session:
Enter a date in the form mm/dd ("q" to quit): 5/2
05/02
May 2
Enter a date in the form mm/dd ("q" to quit): 05/02
05/02
May 2
Enter a date in the form mm/dd ("q" to quit): 52
Invalid date format ? 52
Enter a date in the form mm/dd ("q" to quit): 5.0/2
Invalid format - For input string: "5.0"
Enter a date in the form mm/dd ("q" to quit): 13/2
Invalid month ? 13
Enter a date in the form mm/dd ("q" to quit): 2/x
Invalid format - For input string: "x"
Enter a date in the form mm/dd ("q" to quit): 2/30
Invalid day ? 30
Enter a date in the form mm/dd ("q" to quit): 2/28
02/28
February 28
Enter a date in the form mm/dd ("q" to quit): q
I am trying to attack this ONE STEP at a time, even though I only have until Sunday at midnight. I will leave this post and get some rest, then attack it again in the morning.
Edited by: stillTrying on Jul 12, 2008 8:33 PMChristine,
You'r doing well so far... I like your "top down" approach. Rough out the classes, define ALL the methods, especially the public one... but just sketch out the requirements and/or implementation with a few comments. You'll do well.
(IMHO) The specified design is pretty crappy, especially the Exception handling
[The Constructor] performs complete error checking on the given dateStr value. The Date constructor is the entity that?s responsible for date error checking. That way, if a Date object is instantiated and if there are no errors, then you?re guaranteed that the Date object holds a legitimate date value. If any kind of error occurs, change the value of the error instance variable to a non-null string value, using an appropriate concatenation of a string constant, input substring, and/or API exception message.Please allow me to shred this hubris piece by piece.
[The Constructor] performs complete error checking on the given dateStr value. The Date constructor is the entity that?s responsible for date error checking.Umm... Well I suppose it could... but NO, the constructor should delegate such "complex validation" to a dedicated validate (or maybe isValid) method... which might even be made publicly available... it's a good design.
That way, if a Date object is instantiated and if there are no errors, then you?re guaranteed that the Date object holds a legitimate date value. If any kind of error occurs, change the value of the error instance variable to a non-null string value ...Utter Bollocks! When passed an invalid input string the, Date constructor should throw an InvalidDataException (or similar). It should not SILENTLY set some dodgy error errorMessage attribute, which is returned later by a "print" method. We tried that in masm, fortran, ada, basic, c, and pascal for twenty odd years. It sucked eggs. And it STILL sucks eggs. Java has a "proper" try/catch exception handling mechanism. Use it.
I mean, think it through...
someDate = get a date from the user // user enters invalid date, so someDate is null and errMsg is set.
report = generateReport() // takes (for the sake of argument) three hours.
emailReport(someDate, report) // only to fail at the last hurdle with an InvalidDataException!And anyways... such implementation details are traditionally the implementors choice... ie: it's usually between the programmer and there tech-manager (if they're lucky enough to have one).
Cheers. Keith. -
List display for ALV using class and methods
Hi friends
I want the list display for the ALV using Class and methods
which class and methods i can use.
Here we can't use the REUSE_ALV_LIST_DISPLAY and also GRID
I was done GRID display using class and methods but i want only list display for using class.
plz Give me sample code of list display not for grid.
Thanks
Nani.hi
please check with this code...
declare grid and container.
DATA : o_alvgrid TYPE REF TO cl_gui_alv_grid,
o_dockingcontainer TYPE REF TO cl_gui_docking_container,
i_fieldcat TYPE lvc_t_fcat,"fieldcatalogue
w_layout TYPE lvc_s_layo."layout
If any events like double click,etc., are needed we have to add additional functionality.
call the screen in program.
Then , create the container as follows
IF cl_gui_alv_grid=>offline( ) IS INITIAL.
CREATE OBJECT o_dockingcontainer
EXPORTING
ratio = '95'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
others = 6.
ENDIF.
CREATE OBJECT o_alvgrid
EXPORTING
i_parent = o_dockingcontainer.
Build the fieldcatalog
create a output structure in SEll for the ALV output
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = <alv output>
CHANGING
ct_fieldcat = i_fieldcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE i030."Error in building the field catalogue
LEAVE LIST-PROCESSING.
ENDIF.
*If you need to modify the field catalog,modify it using field sysmbols
*setting the layout
w_layout-grid_title = title.
w_layout-zebra = 'X'.
then displaying the output
CALL METHOD o_alvgrid->set_table_for_first_display
EXPORTING
i_save = 'A'
is_layout = w_layout
CHANGING
it_outtab = i_output[]
it_fieldcatalog = i_fieldcat[]
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE i032 ."Error in Displaying
LEAVE LIST-PROCESSING.
ENDIF.
*After that in PAI of the screen, you need to free the *object while going back from the screen(according to *your requirement)
MODULE user_command_9001 INPUT.
CASE sy-ucomm.
WHEN 'EXIT' OR 'CANC'.
PERFORM f9600_free_objects:
USING o_alvgrid 'ALV' text-e02,
USING o_dockingcontainer 'DOCKING'
text-e01.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_9001 INPUT
*in the program, write the follwoing code
FORM f9600_free_objects USING pobject
value(ptype)
value(ptext).
DATA: l_objectalv TYPE REF TO cl_gui_alv_grid.
CASE ptype.
WHEN 'ALV'.
l_objectalv = pobject.
IF NOT ( l_objectalv IS INITIAL ).
CALL METHOD l_objectalv->free
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3.
CLEAR: pobject, l_objectalv.
PERFORM f9700_error_handle USING ptext.
ENDIF.
WHEN 'DOCKING'.
DATA: lobjectdock TYPE REF TO cl_gui_docking_container.
lobjectdock = pobject.
IF NOT ( lobjectdock IS INITIAL ).
CALL METHOD lobjectdock->free
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3.
CLEAR: pobject, lobjectdock.
PERFORM f9700_error_handle USING ptext.
ENDIF.
WHEN 'CONTAINER'.
DATA: lobjectcontainer TYPE REF TO cl_gui_container.
lobjectcontainer = pobject.
IF NOT ( lobjectcontainer IS INITIAL ).
CALL METHOD lobjectcontainer->free
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3.
CLEAR: pobject, lobjectcontainer.
PERFORM f9700_error_handle USING ptext.
ENDIF.
WHEN OTHERS.
sy-subrc = 1.
PERFORM f9700_error_handle USING
text-e04.
ENDCASE.
ENDFORM. " f9600_free_objects
FORM f9700_error_handle USING value(ptext).
IF sy-subrc NE 0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = text-e03
txt2 = sy-subrc
txt1 = ptext.
ENDIF.
endform.
also check with this
http://help.sap.com/printdocu/core/Print46c/en/data/pdf/BCSRVALV/BCSRVALV.pdf
Hope this helps
if it helped, you can acknowledge the same by rewarding
regards
dinesh -
Hi Experts,
I am studying ABAP Objects, before that I need to know How to use the exsiting classes and Methods in our program and how to search for particular class and methods?
If it explanied with example well and good.
Thanks
saiHi Saikar,
Here i am sending you very useful content for the usage of classes and its methods.
It helped me a lot.
If you find it useful then do not forget to award points.
Table of Contents
Applies to:......................................................................................................................................1
Summary........................................................................................................................................1
Author Bio......................................................................................................................................1
Main Class CL_SALV_TABLE......................................................................................................3
Functions CL_SALV_FUNCTIONS..............................................................................................4
Display Settings CL_SALV_DISPLAY_SETTINGS......................................................................4
Columns CL_SALV_COLUMNS_TABLE and CL_SALV_COLUMN_TABLE..............................5
Sorts CL_SALV_SORTS..............................................................................................................8
Aggregations CL_SALV_AGGREGATIONS..............................................................................10
Filters CL_SALV_FILTERS........................................................................................................12
Layouts CL_SALV_LAYOUT......................................................................................................14
Related Content...........................................................................................................................15
Disclaimer and Liability Notice.......................................................................................................16
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 3
Main Class CL_SALV_TABLE
The main class used to create the simple 2D table is the class CL_SALV_TABLE. Create a reference variable for this class. Create an internal table and fill this internal table with data as show below.
REPORT ZALVOM_DEMO1. data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. start-of-selection. select * into table ispfli from spfli.
Next we need to create the ALV object for the 2D table. The FACTORY method allows you to create the ALV object in 3 ways. You can create the ALV Grid, as a classical list display, as a full screen grid, and finally embedded into a screen container. For this example, we will be working with the full screen grid. Create the call to the FACTORY method. We are importing the object reference into GR_TABLE and passing the internal table ISPFLI.
cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ).
Next we need to display the grid, for this we use the DISPLAY method . Simply call it.
gr_table->display( ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 4
Functions CL_SALV_FUNCTIONS
Next, add functions to the application toolbar. For this, use the CL_SALV_FUNCTIONS class. Create the object reference variable and receive the object using the GET_FUNCTIONS method of the GR_TABLE object. Call the method SET_ALL to force the ALV grid to show all standard functions.
report zalvom_demo1. data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. data: gr_functions type ref to cl_salv_functions. start-of-selection. select * into table ispfli from spfli. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ). gr_functions = gr_table->get_functions( ). gr_functions->set_all( abap_true ). gr_table->display( ).
The result is now you have the standard buttons on the application toolbar.
Display Settings CL_SALV_DISPLAY_SETTINGS
Next, we can change some display settings using the class CL_SALV_DISPLAY_SETTINGS. Create the object reference variable and receive the object using the GET_DISPLAY_SETTINGS method of the GR_TABLE object. In this example, we are setting the Striped Pattern for the ALV Grid rows, and setting the heading in the title bar.
report zalvom_demo1.
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 5
). data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. data: gr_functions type ref to cl_salv_functions. data: gr_display type ref to cl_salv_display_settings. start-of-selection. select * into table ispfli from spfli. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ). gr_functions = gr_table->get_functions( ). gr_functions->set_all( abap_true ). gr_display = gr_table->get_display_settings( ). gr_display->set_striped_pattern( cl_salv_display_settings=>true ). gr_display->set_list_header( 'This is the heading' gr_table->display( ).
Columns CL_SALV_COLUMNS_TABLE and CL_SALV_COLUMN_TABLE
Next, we can change some of the attributes of a specific column in the ALV grid. In this example we will change the Heading Text of a column as well as the color of a column. Create the object reference variable and receive the object using the GET_COLUMNS method of the GR_TABLE object. This will pass you the object for all columns of the ALV grid. To access just one column, call the method GET_COLUMN from the GR_COLUMNS object. In this example, we are accessing the CITYTO column and the CITYFROM column.
report zalvom_demo1. data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. data: gr_functions type ref to cl_salv_functions.
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 6
data: gr_display type ref to cl_salv_display_settings. data: gr_columns type ref to cl_salv_columns_table. data: gr_column type ref to cl_salv_column_table.
data: color type lvc_s_colo.
start-of-selection. select * into table ispfli from spfli. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ). gr_functions = gr_table->get_functions( ). gr_functions->set_all( abap_true ). gr_display = gr_table->get_display_settings( ). gr_display->set_striped_pattern( cl_salv_display_settings=>true ). gr_display->set_list_header( 'This is the heading' ). gr_columns = gr_table->get_columns( ). gr_column ?= gr_columns->get_column( 'CITYTO' ). gr_column->set_long_text( 'This is long text' ). gr_column->set_medium_text( 'This is med text' ).
gr_column->set_short_text( 'This is sh' ).
gr_column ?= gr_columns->get_column( 'CITYFROM' ). color-col = '6'. color-int = '1'. color-inv = '0'. gr_column->set_color( color ).
gr_table->display( ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 7 ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 8
Sorts CL_SALV_SORTS
Next, we can add some sorting to the ALV grid. Create the object reference variable and receive the object using the GET_SORTS method of the GR_TABLE object. Next, add the sort by calling the ADD_SORT method of the GR_SORTS object.
report zalvom_demo1. data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. data: gr_functions type ref to cl_salv_functions. data: gr_display type ref to cl_salv_display_settings. data: gr_columns type ref to cl_salv_columns_table. data: gr_column type ref to cl_salv_column_table. data: gr_sorts type ref to cl_salv_sorts.
data: color type lvc_s_colo.
start-of-selection. select * into table ispfli from spfli. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ). gr_functions = gr_table->get_functions( ). gr_functions->set_all( abap_true ). gr_display = gr_table->get_display_settings( ). gr_display->set_striped_pattern( cl_salv_display_settings=>true ). gr_display->set_list_header( 'This is the heading' ). gr_columns = gr_table->get_columns( ). gr_column ?= gr_columns->get_column( 'CITYTO' ). gr_column->set_long_text( 'This is long text' ). gr_column->set_medium_text( 'This is med text' ). gr_column->set_short_text( 'This is sh' ). gr_column ?= gr_columns->get_column( 'CITYFROM' ). color-col = '6'. color-int = '1'. color-inv = '0'. gr_column->set_color( color ). gr_sorts = gr_table->get_sorts( ). gr_sorts->add_sort 'CITYTO' ). gr_table->display( ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 9 ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 10
Aggregations CL_SALV_AGGREGATIONS
Since we sorted by CITYTO, we can add an aggregation to subtotal the DISTANCE by CITYTO. Create the object reference variable and receive the object using the GET_AGGREGATIONS method of the GR_TABLE object. Next, add the aggregation by calling the ADD_AGGREGATION method of the GR_SORTS object. We also need to modify the call to ADD_SORT to set the SUBTOTAL = ABAP_TRUE.
report zalvom_demo1. data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. data: gr_functions type ref to cl_salv_functions. data: gr_display type ref to cl_salv_display_settings. data: gr_columns type ref to cl_salv_columns_table. data: gr_column type ref to cl_salv_column_table. data: gr_sorts type ref to cl_salv_sorts. data: gr_agg type ref to cl_salv_aggregations.
data: color type lvc_s_colo.
start-of-selection. select * into table ispfli from spfli. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ). gr_functions = gr_table->get_functions( ). gr_functions->set_all( abap_true ). gr_display = gr_table->get_display_settings( ). gr_display->set_striped_pattern( cl_salv_display_settings=>true ). gr_display->set_list_header( 'This is the heading' ). gr_columns = gr_table->get_columns( ). gr_column ?= gr_columns->get_column( 'CITYTO' ). gr_column->set_long_text( 'This is long text' ). gr_column->set_medium_text( 'This is med text' ). gr_column->set_short_text( 'This is sh' ). gr_column ?= gr_columns->get_column( 'CITYFROM' ). color-col = '6'. color-int = '1'. color-inv = '0'. gr_column->set_color( color ). gr_sorts = gr_table->get_sorts( ). gr_sorts->add_sort( columnname = 'CITYTO' subtotal = abap_true ). gr_agg = gr_table->get_aggregations( ). gr_agg->add_aggregation( 'DISTANCE' ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 11
gr_table->display( ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 12
Filters CL_SALV_FILTERS
Using the CL_SALV_FILTERS class we can setup some filters for the data in our ALV GRID. Create the object reference variable and receive the object using the GET_FILTERS method of the GR_TABLE object, and then simply called the method ADD_FILTER with the parameters.
report zalvom_demo1. data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. data: gr_functions type ref to cl_salv_functions. data: gr_display type ref to cl_salv_display_settings. data: gr_columns type ref to cl_salv_columns_table. data: gr_column type ref to cl_salv_column_table. data: gr_sorts type ref to cl_salv_sorts. data: gr_agg type ref to cl_salv_aggregations. data: gr_filter type ref to cl_salv_filters.
data: color type lvc_s_colo.
start-of-selection. select * into table ispfli from spfli. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ). gr_functions = gr_table->get_functions( ). gr_functions->set_all( abap_true ). gr_display = gr_table->get_display_settings( ). gr_display->set_striped_pattern( cl_salv_display_settings=>true ). gr_display->set_list_header( 'This is the heading' ). gr_columns = gr_table->get_columns( ). gr_column ?= gr_columns->get_column( 'CITYTO' ). gr_column->set_long_text( 'This is long text' ). gr_column->set_medium_text( 'This is med text' ). gr_column->set_short_text( 'This is sh' ). gr_column ?= gr_columns->get_column( 'CITYFROM' ). color-col = '6'. color-int = '1'. color-inv = '0'. gr_column->set_color( color ). gr_sorts = gr_table->get_sorts( ). gr_sorts->add_sort( columnname = 'CITYTO' subtotal = abap_true ). gr_agg = gr_table->get_aggregations( ). gr_agg->add_aggregation( 'DISTANCE' ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 13
gr_filter = gr_table->get_filters( ). gr_filter->add_filter( columnname = 'CARRID' low = 'LH' ). gr_table->display( ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 14
Layouts CL_SALV_LAYOUT
If you want to allow the user to manage layouts of the ALV grid, you must use the class CL_SALV_LAYOUT. Create the object reference variable and receive the object using the GET_LAYOUT method of the GR_TABLE object. Then simply call the method SET_KEY with the parameters and set the save restriction using the SET_SAVE_RESTRICTION method.
report zalvom_demo1. data: ispfli type table of spfli. data: gr_table type ref to cl_salv_table. data: gr_functions type ref to cl_salv_functions. data: gr_display type ref to cl_salv_display_settings. data: gr_columns type ref to cl_salv_columns_table. data: gr_column type ref to cl_salv_column_table. data: gr_sorts type ref to cl_salv_sorts. data: gr_agg type ref to cl_salv_aggregations. data: gr_filter type ref to cl_salv_filters. data: gr_layout type ref to cl_salv_layout. data: color type lvc_s_colo. data: key type salv_s_layout_key. start-of-selection. select * into table ispfli from spfli. cl_salv_table=>factory( importing r_salv_table = gr_table changing t_table = ispfli ). gr_functions = gr_table->get_functions( ). gr_functions->set_all( abap_true ). gr_display = gr_table->get_display_settings( ). gr_display->set_striped_pattern( cl_salv_display_settings=>true ). gr_display->set_list_header( 'This is the heading' ). gr_columns = gr_table->get_columns( ). gr_column ?= gr_columns->get_column( 'CITYTO' ). gr_column->set_long_text( 'This is long text' ). gr_column->set_medium_text( 'This is med text' ). gr_column->set_short_text( 'This is sh' ). gr_column ?= gr_columns->get_column( 'CITYFROM' ). color-col = '6'. color-int = '1'. color-inv = '0'. gr_column->set_color( color ). gr_sorts = gr_table->get_sorts( ). gr_sorts->add_sort( columnname = 'CITYTO' subtotal = abap_true ). gr_agg = gr_table->get_aggregations( ).
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 15
gr_filter = gr_table->get_filters( ). gr_layout = gr_table->get_layout( ). gr_layout->set_key( ). gr_table->display( ). gr_agg->add_aggregation( 'DISTANCE' ). gr_filter->add_filter( columnname = 'CARRID' low = 'LH' ). key-report = sy-repid. key gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
Related Content
Help - ALV Object Model
Utilizing the New ALV Object Model
SDN ABAP Forum
ALV Object Model Simple 2D Table - The Basics SAP DEVELOPER NETWORK | sdn.sap.com BUSINESS PROCESS EXPERT COMMUNITY | bpx.sap.com © 2006 SAP AG 16
Disclaimer and Liability Notice
This document may discuss sample coding or other information that does not include SAP official interfaces and therefore is not supported by SAP. Changes made based on this information are not supported and can be overwritten during an upgrade.
SAP will not be held liable for any damages caused by using or misusing the information, code or methods suggested in this document, and anyone using these methods does so at his/her own risk.
SAP offers no guarantees and assumes no responsibility or liability of any type with respect to the content of this technical article or code sample, including any liability resulting from incompatibility between the content within this document and the materials and services offered by SAP. You agree that you will not hold, or seek to hold, SAP responsible or liable with respect to the content of this document.
Regards,
Mandeep.
Note: Award points if contents are useful. -
How to implement classes and methods in badi's ?
how to implement classes and methods in badi's? and where i have to write the code based on the requirement?can anyone explain me briefly?
Hi
Every BADI by default Implements an INTERFACE which already contains some methods with parameters.
So you have to find the relavenet method based on the related paramters (by checking the fields in that paramters) you have to double click on the method and to write the code.
see the doc
DEFINING THE BADI
1) execute Tcode SE18.
2) Specify a definition Name : ZBADI_SPFLI
3) Press create
4) Choose the attribute tab. Specify short desc for badi.. and specify the type :
multiple use.
5) Choose the interface tab
6) Specify interface name: ZIF_EX_BADI_SPFLI and save.
7) Dbl clk on interface name to start class builder . specify a method name (name,
level, desc).
Method level desc
Linese;ection instance methos some desc
8) place the cursor on the method name desc its parameters to define the interface.
Parameter type refe field desc
I_carrid import spfli-carrid some
I_connid import spefi-connid some
9) save , check and activate adapter class proposed by system is
ZCL_IM_IM_LINESEL is genereated.
IMPLEMENTATION OF BADI DEFINITION
1) EXECUTE tcode se18.choose menuitem create from the implementation menubar.
2) Specify aname for implementation ZIM_LINESEL
3) Specify short desc.
4) Choose interface tab. System proposes a name fo the implementation class.
ZCL_IM_IMLINESEL which is already generarted.
5) Specify short desc for method
6) Dbl clk on method to insert code..(check the code in AAA).
7) Save , check and activate the code.
Some useful URL
http://www.esnips.com/doc/e06e4171-29df-462f-b857-54fac19a9d8e/ppt-on-badis.ppt
http://www.esnips.com/doc/10016c34-55a7-4b13-8f5f-bf720422d265/BADIs.pdf
http://www.esnips.com/doc/43a58f51-5d92-4213-913a-de05e9faac0d/Business-Addin.doc
http://www.esnips.com/doc/1e10392e-64d8-4181-b2a5-5f04d8f87839/badi.doc
www.sapgenie.com/publications/saptips/022006%20-%20Zaidi%20BADI.pdf
http://www.sapdevelopment.co.uk/enhance/enhance_badi.htm
http://help.sap.com/saphelp_nw04/helpdata/en/04/f3683c05ea4464e10000000a114084/content.htm
http://help.sap.com/saphelp_nw04/helpdata/en/e6/d54d3c596f0b26e10000000a11402f/content.htm
http://help.sap.com/saphelp_nw2004s/helpdata/en/c2/eab541c5b63031e10000000a155106/frameset.htm
Now write a sample program to use this badi method..
Look for BBB sample program.
AAA
data : wa_flights type sflight,
it_flights type table of sflight.
format color col_heading.
write:/ 'Flight info of:', i_carrid, i_connid.
format color col_normal.
select * from sflight
into corresponding fields of table it_flights
where carrid = i_carrid
and connid = i_connid.
loop at it_flights into wa_flights.
write:/ wa_flights-fldate,
wa_flights-planetype,
wa_flights-price currency wa_flights-currency,
wa_flights-seatsmax,
wa_flights-seatsocc.
endloop.
BBB
*& Report ZBADI_TEST *
REPORT ZBADI_TEST .
tables: spfli.
data: wa_spfli type spfli,
it_spfli type table of spfli with key carrid connid.
*Initialise the object of the interface.
data: exit_ref type ref to ZCL_IM_IM_LINESEL,
exit_ref1 type ref to ZIF_EX_BADISPFLI1.
selection-screen begin of block b1.
select-options: s_carr for spfli-carrid.
selection-screen end of block b1.
start-of-selection.
select * from spfli into corresponding fields of table it_spfli
where carrid in s_carr.
end-of-selection.
loop at it_spfli into wa_spfli.
write:/ wa_spfli-carrid,
wa_spfli-connid,
wa_spfli-cityfrom,
wa_spfli-deptime,
wa_spfli-arrtime.
hide: wa_spfli-carrid, wa_spfli-connid.
endloop.
at line-selection.
check not wa_spfli-carrid is initial.
create object exit_ref.
exit_ref1 = exit_ref.
call method exit_ref1->lineselection
EXPORTING
i_carrid = wa_spfli-carrid
i_connid = wa_spfli-connid.
clear wa_spfli.
Reward points for useful Answers
Regards
Anji
Message was edited by:
Anji Reddy Vangala -
Calling Classes and Methods in Transformation Rules
Hi,
I have transformations from Level 1 to Level 2 ODS where based on the source fields Date of Sale(ZDSALE) I have to derive Period to Date and Year to Date from the class ZBI_UTILITY_METHODS and method ATTRIBUTES_GET. How do i incorporate this in my start and transformation routines. Can someone please give me the code for this and also give some sample codes where classes and methods are called in the transformation rules.
Thanks
Priya.Hi Priya,
I suggest you the way to call method in the class like this:
DATA: o_model TYPE REF TO ZBI_UTILITY_METHODS.
" define v_return variables based on type the method give the value
CREATE OBJECT: o_model.
v_return = o_model->ATTRIBUTES_GET( transfer parameter ).
free o_model.
Hopefully it can help you a lot.
Regards,
Niel. -
What is meant by Local Class and how we can create local classes in abap?
Hi Friends
what is meant by Local Class and how we can create local classes in abap?
Regards,
SreeHi
Local classes are the classes which we declare and use using the SE38 ABAP editor
Global classes are the classes which we find in SE24 and call the methods of them into our program.
see the sample code
REPORT zs_class.
SELECTION SCREEN
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS:p_var TYPE i,
p_var1 TYPE i.
SELECTION-SCREEN END OF BLOCK b1.
CLASS d_class DEFINITION
CLASS d_class DEFINITION.
PUBLIC SECTION.
METHODS:
add,
sub.
PROTECTED SECTION.
DATA : var2 TYPE i.
ENDCLASS. "d_class DEFINITION
CLASS d_class IMPLEMENTATION
CLASS d_class IMPLEMENTATION.
METHOD add.
var2 = p_var + p_var1.
WRITE:/ var2.
ENDMETHOD. "add
METHOD sub.
var2 = p_var - p_var1.
WRITE:/ var2.
ENDMETHOD. "sub
ENDCLASS. "d_class IMPLEMENTATION
START-OF-SELECTION
START-OF-SELECTION.
DATA: obj TYPE REF TO d_class.
CREATE OBJECT: obj .
CALL METHOD: obj->add,
Regards
Anji -
I'm novice in Java, but not novice in programming. So, it is not a problem to understand and to write simple samples, but it is still hard to create a good package structure and give good names for classes.
For example now, I started writing simple standalone application, which will be run by cron and will communicate with 2 webservices. I will receive data(reports) from one webservice, and will send this data to another one. From the very beggining, I have a poblem about structure of roject and naming. Is it ok, to make only one class, with name for example ReportApp? Or better create one class for communicating with first service, another - with second, and main class will call methods of this classes? Also package name... I think it is good, when from package you see, that i is service, or xml.util etc. How can I show in package name that it is batch standalone application? Can somebody explain what names for classes and packages he'll use for such task, please.Descriptive names are nice....
For packages, a standard method is a domain name for your company or organization:
com.widgetsRus.service.
com.widgetsRus.ui.
com.widgetsRus.util.
As for class names, just descripe what the class is for. ReportServer, ReportClient, Report (interface), AbstractReport (implements Report), StatusReport (extends AbstractReport), etc...
As for creating a class for this and that, or separate classes, that's a design issue, but typically, it's easier to maintain things if they are kept in smaller classes with related functionality. -
Can somebody help me? I have a 14000 plus line coded program. I need to generate software produced keystrokes. For example I would like to have my program hit the 'Enter' key instead of it being generated from the keyboard by a user. Now, I have just briefly been introduced to the Robot class and I am trying to understand it. I guess to use it I have to throw a AWTException. The problem is where I need to use the Robot class is in a JButton ActionListener(), which is on line 8000 nested in another frame. My question is how and where do I throw the AWTException in my program so that I can use the Robot class to generate an 'Enter' keystroke? I have noticed that in some sample programs the AWTException follows the opening
public static void main(String[] args) throws AWTException
statement. I tried attaching this in my program but the code nested in a AcitionListener did not recognize it.
What I am hoping is that I can throw the exception in the following format:
try
Robot robot = new Robot();
robot.keypressed(VK_ENTER);
catch (AWTException exception)
exception.printStackTrace();
This is just a format I made up to show what I am looking for it has no actual copyright.
I do not want to throw the AWTExecption for my whole program just this localized area when I need to have the software hit enter for me.
Anyway, this is my problem can you help me out
Derek.I just figured the problem out myself, by just guessing believe it or not.
As follows :
try
Robot rob = new Robot():
rob.keyPressed(VK_ENTER);
catch(AWTException exception)
exception.printStackTrace();
It worked perfectly. -
Documentation for Oracle XML parser Classes and Interfaces
I would like to use the oracle XMLParser V2 classes with JDeveloper 3.1, but I cannot find any reference documentation for the classes and interfaces in help.
I am especially interested in a documentation for the XSLProcessor class. The only information I found was provided with the few provided samples.I don't think the javadoc for this was included in the release. You can get the Javadoc (as well as the latest version of the XML Parser v2) here on OTN.
Take Care,
Rob
null -
ALV using ABAP Classes and Objects
Hi All,
I am trying to print the values in my internal table using ALV, using ABAP classes and objects. Here the title for columns are picked based on the title specified in the data element. I want to set the title of my columns by my own. how to achieve this ?. Please provide me a sample code if possible.
thanks & regards,
Navneeth.KHello Navneeth
The following sample report shows how to build and modify a fieldcatalog (routine <b>BUILD_FIELDCATALOG_KNB1</b>).
*& Report ZUS_SDN_ALVGRID_EVENTS
REPORT zus_sdn_alvgrid_events.
DATA:
gd_okcode TYPE ui_func,
gt_fcat TYPE lvc_t_fcat,
go_docking TYPE REF TO cl_gui_docking_container,
go_grid1 TYPE REF TO cl_gui_alv_grid.
DATA:
gt_knb1 TYPE STANDARD TABLE OF knb1.
PARAMETERS:
p_bukrs TYPE bukrs DEFAULT '2000' OBLIGATORY.
* CLASS lcl_eventhandler DEFINITION
CLASS lcl_eventhandler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING
e_row_id
e_column_id
es_row_no
sender.
ENDCLASS. "lcl_eventhandler DEFINITION
* CLASS lcl_eventhandler IMPLEMENTATION
CLASS lcl_eventhandler IMPLEMENTATION.
METHOD handle_hotspot_click.
* define local data
DATA:
ls_knb1 TYPE knb1,
ls_col_id TYPE lvc_s_col.
READ TABLE gt_knb1 INTO ls_knb1 INDEX e_row_id-index.
CHECK ( ls_knb1-kunnr IS NOT INITIAL ).
CASE e_column_id-fieldname.
WHEN 'KUNNR'.
SET PARAMETER ID 'KUN' FIELD ls_knb1-kunnr.
SET PARAMETER ID 'BUK' FIELD ls_knb1-bukrs.
CALL TRANSACTION 'XD03' AND SKIP FIRST SCREEN.
WHEN 'ERNAM'.
* SET PARAMETER ID 'USR' FIELD ls_knb1-ernam.
* NOTE: no parameter id available, yet simply show the priciple
CALL TRANSACTION 'SU01' AND SKIP FIRST SCREEN.
WHEN OTHERS.
* do nothing
ENDCASE.
* Set active cell to field BUKRS otherwise the focus is still on
* field KUNNR which will always raise event HOTSPOT_CLICK
ls_col_id-fieldname = 'BUKRS'.
CALL METHOD go_grid1->set_current_cell_via_id
EXPORTING
is_row_id = e_row_id
is_column_id = ls_col_id.
ENDMETHOD. "handle_hotspot_click
ENDCLASS. "lcl_eventhandler IMPLEMENTATION
START-OF-SELECTION.
SELECT * FROM knb1 INTO TABLE gt_knb1
WHERE bukrs = p_bukrs.
* Create docking container
CREATE OBJECT go_docking
EXPORTING
parent = cl_gui_container=>screen0
ratio = 90
EXCEPTIONS
OTHERS = 6.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Create ALV grid
CREATE OBJECT go_grid1
EXPORTING
i_parent = go_docking
EXCEPTIONS
OTHERS = 5.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Set event handler
SET HANDLER:
lcl_eventhandler=>handle_hotspot_click FOR go_grid1.
* Build fieldcatalog and set hotspot for field KUNNR
PERFORM build_fieldcatalog_knb1.
* Display data
CALL METHOD go_grid1->set_table_for_first_display
CHANGING
it_outtab = gt_knb1
it_fieldcatalog = gt_fcat
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Link the docking container to the target dynpro
CALL METHOD go_docking->link
EXPORTING
repid = syst-repid
dynnr = '0100'
* CONTAINER =
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* ok-code field = GD_OKCODE
CALL SCREEN '0100'.
END-OF-SELECTION.
*& Module STATUS_0100 OUTPUT
* text
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'.
* SET TITLEBAR 'xxx'.
ENDMODULE. " STATUS_0100 OUTPUT
*& Module USER_COMMAND_0100 INPUT
* text
MODULE user_command_0100 INPUT.
CASE gd_okcode.
WHEN 'BACK' OR
'END' OR
'CANC'.
SET SCREEN 0. LEAVE SCREEN.
WHEN OTHERS.
ENDCASE.
CLEAR: gd_okcode.
ENDMODULE. " USER_COMMAND_0100 INPUT
*& Form BUILD_FIELDCATALOG_KNB1
* text
* --> p1 text
* <-- p2 text
FORM build_fieldcatalog_knb1 .
* define local data
DATA:
ls_fcat TYPE lvc_s_fcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
* I_BUFFER_ACTIVE =
i_structure_name = 'KNB1'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_BYPASSING_BUFFER =
* I_INTERNAL_TABNAME =
CHANGING
ct_fieldcat = gt_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
LOOP AT gt_fcat INTO ls_fcat
WHERE ( fieldname = 'KUNNR' OR
fieldname = 'ERNAM' ).
ls_fcat-hotspot = abap_true.
ls_fcat-scrtext_s = '<short text>'. " short text of column
ls_fcat-scrtext_m = '<medium text>'. " medium text of column
ls_fcat-scrtext_l = '<long text>'. " longtext text of column
ls_fcat-tooltip = '...'. " ALV control: Tool tip for column header
ls_fcat-coltext = '...'. " ALV control: Column heading
MODIFY gt_fcat FROM ls_fcat.
ENDLOOP.
ENDFORM. " BUILD_FIELDCATALOG_KNB1
Regards
Uwe -
SQL, static classes and sessionBeans
Hi,
my JSF-project has one static class where it handle all sql-queries and I asked me if that is the "best" solution.
I.e. a User-Sessionbean call that static class to save his data into the user-sql-table. I asked myself, if it might not better to delete this static class and let the user-sessionbean save his data itself.
If my webserver has 100 usersessions and 50 users save their data at same time, does the "static-sql-save-version" has only one sql-connection and 49 user have to wait in a queue? And with the "every-usersession-has-his-own-sql-save-method" I have got 50 DB connection at the same time?
I hope you could help me :)
Alexyou will gain some bytes by merging all the static classes in one.
you can create a ManagerTool.java class and write inside all the static methods ...
Maybe you are looking for
-
How can I transfer an App purchased on iTunes on my pc to my iPhone 4s. I have tried synching but this does not make the app appear on my iPhone. I cant use wifi as my chip was fried on the latest update.
-
Hi all. A request for a change in the toolbar. Every time I do something the toolbar always changes to the last tool used. Maybe an option to have the toolbar always in the "normal" view, i.e., display all the tools? It gets annoying to keep having t
-
Sync the Apple TV from the Apple TV?
I have mine setup for almost complete streaming (as they don't make a 650GB Apple TV yet), so whenever it decides to 'disconnect' itself or 'hiccup' or any other technical terms for 'lost live connection to my library on the other side of my house',
-
How do i get my pictures and videos from my phone to my pc
How do i get my pictures from my i phone 4s on to my pc my i cloud is full and i want to store them on my pc Thanks
-
I havent got a warranty card with my itouch 4 but how do i enroll my ipod to be eligible for the warranty?????